在介绍题目中的API之前,有必要先解释一下Cesium.Math.nextRandomNumber()(以下简称:随机数生成器),该API的作用是生成一个位于[0, 1)之间的浮点数,通过Mersenne Twister算法(百科词条)实现,该算法中的seed参数可以保证生成的随机数具有可预测性,这里说的可预测性是指相同的种子(seed值)所产生的随机数是相同的,如果不设置seed值,则系统根据时间来自己选择这个值,此时每次生成的随机数因时间差异而不同(知乎原文)。
Cesium官方文档对Cesium.Math.setRandomNumberSeed(seed)(以下简称:seed设置器)的解释是:设置随机数生成器所用的seed参数。在调用随机数生成器之前,调用seed设置器可以控制所生成的随机数。
以下代码生成的随机数是固定的。
Cesium.Math.setRandomNumberSeed(10);
let first = Cesium.Math.nextRandomNumber();
console.log(first);
// 0.7713206431362778
Cesium.Math.setRandomNumberSeed(0);
let second = Cesium.Math.nextRandomNumber();
console.log(second);
// 0.548813502304256
关于作用域
测试代码段一:
function generateRandom() {
Cesium.Math.setRandomNumberSeed(10);
let out = Cesium.Math.nextRandomNumber();
for (let i = 0; i<3; ++i){
let temp = Cesium.Math.nextRandomNumber();
console.log(temp);
}
console.log(out);
}
generateRandom();
// 0.2987611584831029
// 0.020751946605741978
// 0.49458992830477655
// 0.7713206431362778
测试代码段二:
function generateRandom() {
Cesium.Math.setRandomNumberSeed(10);
for (let i = 0; i<3; ++i){
let temp = Cesium.Math.nextRandomNumber();
console.log(temp);
}
let out = Cesium.Math.nextRandomNumber();
console.log(out);
}
generateRandom();
// 0.7713206431362778
// 0.2987611584831029
// 0.020751946605741978
// 0.49458992830477655
上述两段代码的差别只是out变量的位置不一样,通过测试可以得出如下结论:
(1)seed设置器对作用域中的所有随机数生成器产生作用。
(2)seed设置器对随机数生成器产生作用顺序固定。
作用
为了生成一个固定可再生的随机数(For reproducible random number),也就是说需要一个随机数,但是又需要该随机数固定,不是每次执行或调用都不一样。