Files
cocos-engine/tests/utils/random.ts
Leslie Leigh (李的序) a0e3037ae1 Add test utils: vec3, quat equality matcher and pseudo random generator (#15547)
* Add test utils: vec3 equality matcher and pseudo random generator

* Add Quat jest matcher

* Tweak

* Update
2023-06-29 11:05:39 +08:00

63 lines
1.6 KiB
TypeScript

export class PseudoRandomGenerator {
constructor(initialSeed: number) {
this._seed = initialSeed;
}
get defaultOrder() { return this._defaultOrder }
set defaultOrder(value) { this._defaultOrder = value; }
/** Generates number in [min, max]. */
public range(min: number, max: number) {
if (min > max) {
throw new Error(`min should not be greater than max.`);
}
return min + (max - min) * this.range01();
}
/** Generates number in [0, 1]. */
public range01() {
return mulberry32(this._seed++);
}
/** Generates number in [-1, 1]. */
public normalized() {
return this.range(-1, 1);
}
/**
* Generates a finite number.
* @order The order(max mag).
*/
public finite(order=this._defaultOrder) {
return this.normalized() * order;
}
/**
* Generates a positive number.
* @order The order(max mag).
*/
public positive(order=this._defaultOrder) {
return this.range01() * order + order * 1e-6;
}
/**
* Generates a negative number.
* @order The order(max mag).
*/
public negative(order=this._defaultOrder) {
return this.range01() * -order - order * 1e-6;
}
private _seed = 0;
private _defaultOrder = 1e3;
}
export { getMagicSeed } from './random-seed';
function mulberry32(a: number) {
// https://stackoverflow.com/a/47593316
let t = a += 0x6D2B79F5;
t = Math.imul(t ^ t >>> 15, t | 1);
t ^= t + Math.imul(t ^ t >>> 7, t | 61);
return ((t ^ t >>> 14) >>> 0) / 4294967296;
}