/** * 线性同余随机数生成器,因为js提供的api不支持种子,所以为了匹配Unity,另写一套 * @author 袁浩 */ export class Random { /** * 创建一个随机数生成器 */ public constructor(seed: number) { this.seed = seed; if (!this.seed && this.seed != 0) { this.seed = new Date().getTime(); } } /** * 设置用于随机数生成器的种子,如果不设置则实际是取当前时间毫秒数 */ public seed: number; /** * 返回一个随机数,在0.0~1.0之间 */ public get value(): number { return this.range(0, 1); } /** * 返回半径为1的圆内的一个随机点 */ public get insideUnitCircle(): { x: number, y: number } { var randomAngle: number = this.range(0, 360); var randomDis: number = this.range(0, 1); var randomX: number = randomDis * Math.cos(randomAngle * Math.PI / 180); var randomY: number = randomDis * Math.sin(randomAngle * Math.PI / 180); return { x: randomX, y: randomY }; } /** * 返回半径为1的圆边的一个随机点 */ public get onUnitCircle(): { x: number, y: number } { var randomAngle: number = this.range(0, 360); var randomX: number = Math.cos(randomAngle * Math.PI / 180); var randomY: number = Math.sin(randomAngle * Math.PI / 180); return { x: randomX, y: randomY }; } /** * 返回一个在min和max之间的随机浮点数 */ public range(min: number, max: number): number { if (!this.seed && this.seed != 0) { this.seed = new Date().getTime(); } max = max || 1; min = min || 0; this.seed = (this.seed * 9301 + 49297) % 233280; var rnd = this.seed / 233280.0; return min + rnd * (max - min); } }