是否有可能在JavaScript中播种随机数生成器(Math.random) ?
当前回答
如今,许多需要Javascript中可种子随机数生成器的人都在使用David Bau的seedrandom模块。
其他回答
如今,许多需要Javascript中可种子随机数生成器的人都在使用David Bau的seedrandom模块。
编写自己的伪随机生成器非常简单。
戴夫·斯科塞斯的建议是有用的,但正如其他人指出的那样,它并不是完全均匀分布的。
然而,这并不是因为sin的整数参数。这只是因为sin的范围,恰好是一个圆的一维投影。如果取圆的角度,它就会是均匀的。
所以用arg(exp(i * x)) / (2 * PI)代替sin(x)
如果你不喜欢线性顺序,可以把它和异或混合一下。实际因素也没有那么重要。
要生成n个伪随机数,可以使用以下代码:
function psora(k, n) {
var r = Math.PI * (k ^ n)
return r - Math.floor(r)
}
n = 42; for(k = 0; k < n; k++) console.log(psora(k, n))
还请注意,当需要真实熵时,不能使用伪随机序列。
在PHP中,有一个srand(seed)函数,它为特定的seed生成固定的随机值。 但是,在JS中,没有这样的内置函数。
然而,我们可以编写简单而简短的函数。
第一步:选择一些种子(固定编号)。 Var种子= 100; Number应为正整数且大于1,详见步骤2。
第2步:在Seed上执行Math.sin()函数,它将给出该数字的sin值。将这个值存储在变量x中。
var x;
x = Math.sin(seed); // Will Return Fractional Value between -1 & 1 (ex. 0.4059..)
sin()方法返回一个介于-1到1之间的分数值。我们不需要负数,因此,在第一步中选择大于1的数字。
步骤3:返回值是-1到1之间的分数值。所以这个值乘以10使它大于1。
x = x * 10; // 10 for Single Digit Number
第四步:将数值乘以10,得到额外的数字
x = x * 10; // Will Give value between 10 and 99 OR
x = x * 100; // Will Give value between 100 and 999
按要求的数字相乘。
结果将是十进制的。
第五步:通过Math's Round (Math. Round())方法删除小数点后的值。
x = Math.round(x); // This will give Integer Value.
第六步:用数学把负值转化为正数(如果有的话)。abs方法
x = Math.abs(x); // Convert Negative Values into Positive(if any)
解释。最终代码
var seed = 111; // Any Number greater than 1
var digit = 10 // 1 => single digit, 10 => 2 Digits, 100 => 3 Digits and so. (Multiple of 10)
var x; // Initialize the Value to store the result
x = Math.sin(seed); // Perform Mathematical Sin Method on Seed.
x = x * 10; // Convert that number into integer
x = x * digit; // Number of Digits to be included
x = Math.round(x); // Remove Decimals
x = Math.abs(x); // Convert Negative Number into Positive
干净和优化的函数代码
function random_seed(seed, digit = 1) {
var x = Math.abs(Math.round(Math.sin(seed++) * 10 * digit));
return x;
}
然后调用此函数using Random_seed (any_number, number_of_digits)any_number必须且应该大于1。number_of_digits是可选参数,如果没有传递,将返回1 Digit。
random_seed(555); // 1 Digit
random_seed(234, 1); // 1 Digit
random_seed(7895656, 1000); // 4 Digit
对于0到100之间的数。
Number.parseInt(Math.floor(Math.random() * 100))
对于一个固定的种子有一个简单的方法:
function fixedrandom(p){
const seed = 43758.5453123;
return (Math.abs(Math.sin(p)) * seed)%1;
}
推荐文章
- 输入触发器按钮单击
- 获取对象的属性名
- 如何检查用户是否可以回到浏览器历史
- 相当于字符串。jQuery格式
- 如何在vue-cli项目中更改端口号
- Angular 2模板中的标签是什么意思?
- JavaScript .includes()方法的多个条件
- 窗口。亲近与自我。close不关闭Chrome中的窗口
- 同步和异步编程(在node.js中)的区别是什么?
- 在d3.js中调整窗口大小时调整svg的大小
- 如何将两个字符串相加,就好像它们是数字一样?
- 绑定多个事件到一个监听器(没有JQuery)?
- 在JavaScript中将JSON字符串解析为特定对象原型
- 将字符串“true”/“false”转换为布尔值
- 如何使用JavaScript代码获得浏览器宽度?