让我们使用0和1创建一个RandomFunction

时间:2019-02-01 01:40:19

标签: javascript

我上次问过你,但我解决不了。

我有一个随机返回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
}

这是我编写的代码。我可以更改为更好的代码吗?

谢谢。

1 个答案:

答案 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的二进制数。