【问题标题】:How to generate a random number <= 7 from two random numbers <= 5?如何从两个随机数<= 5生成一个随机数<= 7?
【发布时间】:2015-10-03 03:38:21
【问题描述】:

这是参考实现,我不明白为什么在这里选择21?谢谢。

public static int rand7() {
    while (true) {
        int num = 5 * (rand5() - 1) + (rand5() - 1);
        if (num < 21) return (num % 7 + 1);
    }
}

顺便说一句,我在提问之前阅读了这个问题,我的具体问题是为什么在这里使用 21。在那个线程中,它没有被回答。如果我遗漏了什么,请随时纠正。谢谢。 :) 提前致谢, 林

【问题讨论】:

  • 这不是python,而是java。无论如何,这是Expand a random range from 1–5 to 1–7的副本
  • @smci,我在提问之前阅读了这个问题,我的具体问题是为什么在这里使用 21。在那个线程中,它没有被回答。如果我遗漏了什么,请随时纠正。谢谢。 :)
  • 我不知道,但在另一个问题中,他们正在生成一个 if (num < 21) ... 应该是&gt;= 21。如果您说明此问题的来源,将会有所帮助。
  • 这不是生成随机数
  • @LinMa 因为rand(5)-1 产生一个以 5 为底的数字,所以他们将其乘以 5 使其成为 5s 的单位

标签: algorithm random


【解决方案1】:

因为 21 是 7 的倍数。

术语5 * (rand5() - 1) + (rand5() - 1) 产生一个[0, 24] 范围内的数字(均匀分布)。然后用% 7 在[0, 6] 中创建一个随机数。但是,如果您使用整个范围,这不会产生均匀分布。余数 0、1、2、3 比余数 4、5、6 多出现一次。因此,产生这些余数之一的相应数字被切断,仅使用范围 [0, 20] (&lt; 21)。您可以等效地切断前 4 个数字 (&gt; 3) 以产生均匀分布。

【讨论】:

  • 谢谢 Nico,我的问题是为什么要使用 21 而不是 14 或 7? 14 和 7 都是 7 的时间。任何见解都值得赞赏。 :)
  • 因为您想丢弃尽可能少的数字,以便尽快返回有效数字。 21 是小于或等于 25 (=5^2) 的 7 的最大倍数。
  • 是的,没错。你可以使用任何范围。但是 [0, 24] 可能是最直接的(它是以 5 为底的两位数)。
  • 因为这样我们就可以将生成的数字用作另一个数字的数字。您可以在 the Wikipedia page 上阅读有关位置符号的更多信息。
  • 但随后数字的范围重叠,您最终会再次出现非均匀分布。例如。对于3 * (rand5() - 1) + (rand5() - 1),数字4 既可以表示为3 * 0 + 4,也可以表示为3 * 1 + 1。
猜你喜欢
  • 2011-08-09
  • 2023-01-03
  • 2018-04-21
  • 1970-01-01
  • 2011-09-18
  • 2018-04-03
  • 1970-01-01
  • 2013-05-20
  • 1970-01-01
相关资源
最近更新 更多