如何使用JavaScript创建随机数生成器函数而不使用Math.random()函数?

问题描述 投票:1回答:3

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

javascript random numbers
3个回答
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());

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


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());
}
© www.soinside.com 2019 - 2024. All rights reserved.