种子随机数
SeededRandom
Section titled “SeededRandom”基于 xorshift128+ 算法的确定性伪随机数生成器:
import { createSeededRandom } from '@esengine/procgen';
const rng = createSeededRandom(42);// [0, 1) 浮点数rng.next();
// [min, max] 整数rng.nextInt(1, 10);
// [min, max) 浮点数rng.nextFloat(0, 100);
// 布尔值(可指定概率)rng.nextBool(); // 50%rng.nextBool(0.3); // 30%
// 重置到初始状态rng.reset();// 正态分布(高斯分布)rng.nextGaussian(); // 均值 0, 标准差 1rng.nextGaussian(100, 15); // 均值 100, 标准差 15
// 指数分布rng.nextExponential(); // λ = 1rng.nextExponential(0.5); // λ = 0.5// 圆内均匀分布的点const point = rng.nextPointInCircle(50); // { x, y }
// 圆周上的点const edge = rng.nextPointOnCircle(50); // { x, y }
// 球内均匀分布的点const point3D = rng.nextPointInSphere(50); // { x, y, z }
// 随机方向向量const dir = rng.nextDirection2D(); // { x, y },长度为 1相同种子总是产生相同序列:
const rng1 = createSeededRandom(12345);const rng2 = createSeededRandom(12345);
// 这两个序列完全相同console.log(rng1.next()); // 0.xxxconsole.log(rng2.next()); // 0.xxx (相同)
console.log(rng1.nextInt(1, 100)); // Nconsole.log(rng2.nextInt(1, 100)); // N (相同)保存和恢复状态
Section titled “保存和恢复状态”// 保存种子以便重现const seed = Date.now();const rng = createSeededRandom(seed);saveSeed(seed);
// 之后可以使用相同种子重现const savedSeed = loadSeed();const rng2 = createSeededRandom(savedSeed);// 将产生相同序列