我想使用JavaScript创建随机数生成器函数,该函数将返回0到1之间的随机数。是否可以在不使用Math.random()
函数的情况下创建自定义随机数生成器函数?
我尝试了这种方法。它可以工作,但我不知道它是否真的是随机的或有任何模式?
var lastRand = 0.5;
function rand(){
var x = new Date().getTime()*Math.PI*lastRand;
var randNum = x%1;
lastRand = randNum;
return randNum;
}
// Output
for(var n = 0; n < 50; n++){
console.log(rand());
}
此函数取决于变量lastRand
来生成数字。但是我想要更有效的方法。
答案 0 :(得分:1)
为什么不这样呢?对我来说,它似乎更随机,因为它不依赖于值。
var lastRand, randNum;
function rand(){
while(randNum == lastRand)
randNum = (new Date().getTime()*Math.PI)%1;
return lastRand = randNum;
}
// Output
for(var n = 0; n < 50; n++)
console.log(rand());
答案 1 :(得分:0)
这是使用函数生成器的版本,不需要外部变量。
function *makeRand() {
let seed = new Date().getTime()
while (true) {
seed = seed * 16807 % 2147483647
yield seed / 2147483647
}
}
// Usage
let rand = makeRand()
for (let i = 0; i < 5; i++) {
console.log(rand.next().value)
}
// 0.05930273982663767
// 0.7011482662992311
// 0.1989116911771296
// 0.10879361401721538
// 0.4942707873388523
答案 2 :(得分:0)
我有一个更好的解决方案。它使用对象而不是外部变量。
var Random = {
"lastRand" : 0.5,
"randNum" : 0.5,
"rand" : function(){
while(this.randNum == this.lastRand){
this.randNum = (new Date().getTime()*Math.PI*this.lastRand)%1;
}
return this.lastRand = this.randNum;
}
}
for(var n = 0; n < 50; n++){
console.log(Random.rand());
}