如何在不使用Math.random()函数的情况下使用JavaScript创建随机数生成器函数?

时间:2019-03-29 15:14:22

标签: javascript random numbers

我想使用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来生成数字。但是我想要更有效的方法。

3 个答案:

答案 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

来源:https://www.cse.wustl.edu/~jain/iucee/ftp/k_26rng.pdf

答案 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());
}

相关问题