Random.ts 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /**设种一个随机种子保证随机结果一致
  2. * 后面需要可以引入 seedrandom 库
  3. */
  4. class Random {
  5. private _seed: number;
  6. private _start_seed: number;
  7. /**当前种子*/
  8. public get seed(): number {
  9. return this._seed;
  10. }
  11. /**原始种子*/
  12. public get start_seed(): number {
  13. return this._start_seed;
  14. }
  15. /**随机种子*/
  16. constructor(seed: number) {
  17. this.set_seed(seed);
  18. }
  19. /**设置当前开始种子*/
  20. public set_seed(seed: number) {
  21. this._seed = seed;
  22. this._start_seed = seed;
  23. }
  24. private _nextSeed(): void {
  25. this._seed = (this._seed * 9301 + 49297) % 233280;
  26. }
  27. /**0.0(含)-1.0(不含)*/
  28. private _nextFloat(): number {
  29. this._nextSeed();
  30. return this._seed / 233280;
  31. }
  32. /**0(含)-max(不含) */
  33. private _nextInt(max: number): number {
  34. max = Math.floor(max);
  35. this._nextSeed();
  36. return this._seed % max;
  37. }
  38. /**
  39. * 生成指定范围的随机浮点数
  40. * @param min 最小值(含)
  41. * @param max 最大值(不含)
  42. */
  43. public float(min: number = 0, max: number = 1): number {
  44. return this._nextFloat() * (max - min) + min;
  45. }
  46. /**
  47. * 生成指定范围的随机整数
  48. * @param min 最小值(含)
  49. * @param max 最大值(不含)
  50. * @returns
  51. */
  52. public int(min: number = 0, max: number = 100): number {
  53. return this._nextInt(max - min) + Math.ceil(min);
  54. }
  55. /** 生成随机整数 -1 或 1*/
  56. public dir(): -1 | 1 {
  57. return Math.floor(this.float() * 2) === 0 ? -1 : 1;
  58. }
  59. /**
  60. * 在指定数组中随机取出N个不重复的数据
  61. * @param resArr
  62. * @param ranNum
  63. * @returns {Array}
  64. */
  65. public getDiffValueFromArr<T>(resArr: Array<T>, ranNum: number): Array<T> {
  66. let arr = new Array<T>();
  67. let result = new Array<T>();
  68. if (!resArr || resArr.length <= 0 || ranNum <= 0) {
  69. return result;
  70. }
  71. for (let i = 0; i < resArr.length; i++) {
  72. arr.push(resArr[i]);
  73. }
  74. if (ranNum >= arr.length) return arr;
  75. ranNum = Math.min(ranNum, arr.length - 1);
  76. for (let i = 0; i < ranNum; i++) {
  77. let ran = this.int(0, arr.length - 1);
  78. result.push(arr.splice(ran, 1)[0]);
  79. }
  80. return result;
  81. }
  82. /**
  83. * 生成指定范围的随机整数
  84. * @param min 最小值
  85. * @param max 最大值
  86. * @param type 类型
  87. * @example
  88. //type=1 [min,max) 得到一个两数之间的随机整数,这个值不小于min(如果min不是整数的话,得到一个向上取整的 min),并且小于(但不等于)max
  89. //type=2 [min,max] 得到一个两数之间的随机整数,包括两个数在内,这个值比min大(如果min不是整数,那就不小于比min大的整数),但小于(但不等于)max
  90. //type=3 (min,max) 得到一个两数之间的随机整数
  91. */
  92. public int_type(min: number, max: number, type: number): number {
  93. min = Math.ceil(min);
  94. max = Math.floor(max);
  95. switch (type) {
  96. case 1: // [min,max) 得到一个两数之间的随机整数,这个值不小于min(如果min不是整数的话,得到一个向上取整的 min),并且小于(但不等于)max
  97. return Math.floor(this._nextFloat() * (max - min)) + min;
  98. case 2: // [min,max] 得到一个两数之间的随机整数,包括两个数在内,这个值比min大(如果min不是整数,那就不小于比min大的整数),但小于(但不等于)max
  99. return Math.floor(this._nextFloat() * (max - min + 1)) + min;
  100. case 3: // (min,max) 得到一个两数之间的随机整数
  101. return Math.floor(this._nextFloat() * (max - min - 1)) + min + 1;
  102. }
  103. return 0;
  104. }
  105. }
  106. /**创建一个设定好种子的随机数实例*/
  107. export default function get_new_random(seed: number): Random { return new Random(seed); }