我上次问过你,但我解决不了。
我有一个随机返回0和1的函数
const get_zero_or_one = () => {
return Math.floor(Math.random() * (2))
}
我想使用上面的函数做一个随机函数。但是没有Math.random(上面使用的get_zero_or_one除外)。
const RandomResult = (max_number) => {
let answer = 0;
for (let i = 0; i < max_number -1; i++) {
answer += get_zero_or_one()
}
return answer
}
这是我编写的代码。我可以更改为更好的代码吗?
谢谢。
答案 0 :(得分:-1)
https://arxiv.org/pdf/1304.1916v1.pdf中描述的FastDiceRoller
算法为您提供了随机的均匀(ish)分布。
以下是使用您的函数从该论文中摘录的一个实现:
function fastDiceRoller(max_number){
v = 1
c = 0
while(true){
v = 2*v
c = 2*c + get_zero_or_one()
if(v >= max_number){
if(c < max_number) { return(c) }
v = v - max_number
c = c - max_number
}
}
}
以下是一百万次跑步的一些频率:
Map {
0 => 100327,
1 => 99930,
2 => 100389,
3 => 99824,
4 => 100116,
5 => 99999,
6 => 99700,
7 => 99957,
8 => 99980,
9 => 99778 }
希望有帮助。
实质上,它使用您的函数来构建小于max_number
的二进制数。