Javascript 使用模运算得到范围内的随机整数

Javascript 使用模运算得到范围内的随机整数,javascript,php,Javascript,Php,我的目标是拥有一个种子PRNG,它在Javascript和PHP中生成相同的数字。我发现一个线性同余生成器可以在两种环境下工作,但我的问题是,如果我使用除法使其在我需要的范围内,Javascript和PHP的不同浮点精度意味着数字将略有不同 我不确定在我的具体情况下这是否会是一个问题(我不需要大于100的数字),但为了解决这个问题,我尝试使用模运算符。正如我所预料的,由于PRNG生成的数字相对较小,所以随着数字的增加,每个数字出现的概率都会变小 是否有任何(可能是简单的)算法可以在客户端和服务器

我的目标是拥有一个种子PRNG,它在Javascript和PHP中生成相同的数字。我发现一个线性同余生成器可以在两种环境下工作,但我的问题是,如果我使用除法使其在我需要的范围内,Javascript和PHP的不同浮点精度意味着数字将略有不同

我不确定在我的具体情况下这是否会是一个问题(我不需要大于100的数字),但为了解决这个问题,我尝试使用模运算符。正如我所预料的,由于PRNG生成的数字相对较小,所以随着数字的增加,每个数字出现的概率都会变小

是否有任何(可能是简单的)算法可以在客户端和服务器端可靠地工作

这是Javascript中的生成器,它使用模运算符获取范围内的整数,以及一些代码,这些代码表明较高的数字出现的频率较低

function SeededRandom(newSeed) {
    this.seed = newSeed;
    this.Random = function (max) {//max value not included
        this.seed = (this.seed * 20077 + 12345) % 32768;
        return this.seed % max;
    }
}

const MAX_ITER = 1000000;
const MAX_VALUE = 10000;

let random = new SeededRandom(123456);
let array = new Array(MAX_VALUE).fill(0);

for (let iii = 0; iii < MAX_ITER; iii++) {
    array[random.Random(MAX_VALUE)]++;
}

for (let iii = 0; iii < MAX_VALUE; iii++) {
    console.log(iii + ". " + (array[iii] / MAX_ITER));
}
函数seedrandom(newSeed){
这个种子=新种子;
this.Random=函数(max){//max值不包括在内
this.seed=(this.seed*20077+12345)%32768;
返回此种子%max;
}
}
const MAX_ITER=1000000;
常数最大值=10000;
设random=newseedrandom(123456);
让数组=新数组(最大值)。填充(0);
对于(设iii=0;iii
我能想到的最简单的方法是使用依赖于按位操作的PRNG,该操作在javascript上被指定为“就好像在32位上”,这应该与php相同?例如,或其中一种变体,可使操作在两种语言上表现相同。或者,我确信有一些方法可以使其他PRNG行为相同,尽管可能更困难。您应该展示您使用的模数代码,并更好地解释您所说的“每个数字出现的概率随着数字的增加而变小”的意思因为这听起来根本不对。@Sammitch模数是标准javascript和php的%符号。如果你运行我提供的代码(计算出每个数字出现的概率),你就会明白我的意思。@ASDFGerte谢谢,我会尝试一下:)是的。如果你想要的范围不能平均地划分你的PRNG输出范围,你就会发生这种情况。这就是为什么您应该使用更好的PRNG,它可以输出一个完整的32或64位整数,从而将问题降低到一个非常小的误差范围。