【问题标题】:Why not generate a random number 1-7 using this combination of random numbers from 1-5?为什么不使用 1-5 的随机数组合生成随机数 1-7?
【发布时间】:2017-09-20 17:52:33
【问题描述】:

假设我们有一个随机生成器函数rand5,它生成一个介于 1 和 5 之间的随机数,包括 1 和 5。我已经看到,如果你想用它来生成一个介于 1 和 7 之间的随机数,包括在内,你应该重复计算

(5 * (rand5() - 1) + rand5())

生成一个介于 1 到 30(含)之间的随机数,并重复此过程直到生成介于 1 到 21 之间的数字,然后取结果 mod 7。

为什么不直接使用这个公式直接计算 1 到 7 之间的随机数?

(rand5() + rand5() + rand5()) % 7 + 1

【问题讨论】:

  • 因为rand5() + rand5() - 3可以给-1?
  • 计算您可以使用表达式获得每个数字的次数(将每个值替换为 1-5 会给您 5*5*5=125 个表达式进行评估)。您甚至可以编写一个三重 for 循环来为您执行此操作。这应该可以很好地解释发生了什么。
  • @user3833308 那么5 * rand5() + rand5()) - 1 是如何生成 1,2,3,4 的呢?
  • 你真的应该在你的问题中从头开始解释这个问题。这对于不熟悉它的人来说非常神秘。
  • 您还可以搜索掷 2 个骰子 时获得不同结果的概率 - 这是一个相当常见的示例,说明为什么添加均匀分布不会导致均匀分布。

标签: algorithm math random


【解决方案1】:

这是一个更简单的相关问题。假设您想生成一个介于 1 和 8 之间的数字(包括 1 和 8),并且您有一对六面骰子。如果您尝试通过掷骰子来生成这样一个随机数,取结果 mod 8,然后加一个,会发生什么?也就是说,如果您执行以下操作会发生什么?

int value = (rand6() + rand6()) % 8 + 1;

这将在正确的范围内生成一个随机数,但不会均匀地生成它们。具体来说,掷骰子得到不同总数的概率并不统一:

 2:   1 / 36
 3:   2 / 36
 4:   3 / 36
 5:   4 / 36
 6:   5 / 36
 7:   6 / 36
 8:   5 / 36
 9:   4 / 36
10:   3 / 36
11:   2 / 36
12:   1 / 36

取这些数字,将它们修改为 8,加 1,然后将它们组合在一起,得到 1 到 8 之间的每个数字的生成概率如下:

 1:   5 / 36  (have to roll 8)
 2:   4 / 36  (have to roll 9)
 3:   4 / 36  (have to roll 2 or 10)
 4:   4 / 36  (have to roll 3 or 11)
 5:   4 / 36  (have to roll 4 or 12)
 6:   4 / 36  (have to roll 5)
 7:   5 / 36  (have to roll 6)
 8:   6 / 36  (have to roll 7)

请注意,这些概率并不统一;你得到 1、7 或 8 的可能性比其他任何东西都高。

此示例与您提出的不完全一致,但想法相同。将多个均匀随机值相加并不会在它们的总和范围内为您提供均匀分布,因此如果您从这种非均匀分布开始并使用 mod 尝试将其压缩到更小的范围内,您将得到返回 a 在该范围内分布,但不一定是均匀

更复杂的公式 - 顺便说一下,它是一种拒绝采样 - 在某个范围 (1 - 30) 上生成一个均匀随机数,重复这个过程直到它得到介于 1 之间的数值- 21. 然后保证在该范围内产生的值是均匀随机的,并且由于 21 是 7 的倍数,因此以 7 为模可以保证 1 - 7 之间的均匀随机值。

【讨论】:

  • 第一个代码块中的x / 36 代表什么?
  • @user3833308 x 超过 36 的分数。:-)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 1970-01-01
  • 2017-07-25
  • 2012-11-21
相关资源
最近更新 更多