Random.ts 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657
  1. /**
  2. * 线性同余随机数生成器,因为js提供的api不支持种子,所以为了匹配Unity,另写一套
  3. * @author 袁浩
  4. */
  5. export class Random {
  6. /**
  7. * 创建一个随机数生成器
  8. */
  9. public constructor(seed: number) {
  10. this.seed = seed;
  11. if (!this.seed && this.seed != 0) {
  12. this.seed = new Date().getTime();
  13. }
  14. }
  15. /**
  16. * 设置用于随机数生成器的种子,如果不设置则实际是取当前时间毫秒数
  17. */
  18. public seed: number;
  19. /**
  20. * 返回一个随机数,在0.0~1.0之间
  21. */
  22. public get value(): number {
  23. return this.range(0, 1);
  24. }
  25. /**
  26. * 返回半径为1的圆内的一个随机点
  27. */
  28. public get insideUnitCircle(): { x: number, y: number } {
  29. var randomAngle: number = this.range(0, 360);
  30. var randomDis: number = this.range(0, 1);
  31. var randomX: number = randomDis * Math.cos(randomAngle * Math.PI / 180);
  32. var randomY: number = randomDis * Math.sin(randomAngle * Math.PI / 180);
  33. return { x: randomX, y: randomY };
  34. }
  35. /**
  36. * 返回半径为1的圆边的一个随机点
  37. */
  38. public get onUnitCircle(): { x: number, y: number } {
  39. var randomAngle: number = this.range(0, 360);
  40. var randomX: number = Math.cos(randomAngle * Math.PI / 180);
  41. var randomY: number = Math.sin(randomAngle * Math.PI / 180);
  42. return { x: randomX, y: randomY };
  43. }
  44. /**
  45. * 返回一个在min和max之间的随机浮点数
  46. */
  47. public range(min: number, max: number): number {
  48. if (!this.seed && this.seed != 0) {
  49. this.seed = new Date().getTime();
  50. }
  51. max = max || 1;
  52. min = min || 0;
  53. this.seed = (this.seed * 9301 + 49297) % 233280;
  54. var rnd = this.seed / 233280.0;
  55. return min + rnd * (max - min);
  56. }
  57. }