生成随机数,不包括范围

时间:2008-10-12 20:09:46

标签: language-agnostic random

如何在排除某些范围的同时生成范围内的随机数。例如。范围1-10但不是2-4或7。 到目前为止我用过的解决方案:

  • 如果是,则生成随机测试 在不允许的范围内。 根据结果​​输出 编号或重试。
  • 允许地图 范围均匀。得到 在1到6之间随机然后映射 后退(即6变为10)。
  • 创建 允许范围(1-1,5-6,8-10)。 随机选择一个范围(可选 使用权重)和所选的数字 范围。

你的解决方案是什么?

5 个答案:

答案 0 :(得分:8)

(b)使用单一范围并映射到允许的值。

(a)较慢且运行时间不确定,因为您必须等到获得正确范围内的数字。如果你要跳过大范围,你就会受到冲击。

(c)比(b)更复杂;如果不需要,不要增加复杂性。

答案 1 :(得分:1)

取决于排除范围的数量/数量。测试不允许的范围(您的选项1)适用于小型套装;无需将解决方案复杂化为一个简单的问题。解决方案3可以更好地用于更多的排除集。解决方案2是最重要的工作,但可能是最正确的理论解决方案。

答案 2 :(得分:1)

我通常使用上面第2项子弹描述的技术,特别是如果允许数量的集合相当小的话。从统计学的角度来看,很容易破坏结果的随机性或者使结果偏离平坦的分布。

它具有允许单个选择(如发牌或拾取宾果球)的额外优势......您只需从地图中删除已选择的值。

答案 3 :(得分:1)

将它们映射到您期望的总范围。然后在范围之间分配它们。

E.g。如果您需要0..10和100..110之间的随机

生成一个介于20之间的随机数。下面的10个被分配到0..10范围,其余的被分配到另一个区间(或者类似的东西 - 我可能会被一个人关闭..间隔算术就是其中之一在第一次尝试时我从来没有做过的事情。)

这背后的原因是你经常处理非完美的随机生成器。如果您在几个维度上分布连续的随机数变量(例如,首先选择一个随机间隔,然后在所选间隔内选择一个随机数),这些开始表现得很奇怪。这可能导致非常明显的非随机行为。

如果你从一个更好的随机数生成器开始,从真正的随机源获取它的数据,你可能最终浪费宝贵的随机位。如果你每秒只做一次它可能不是问题。如果你经常这样做,虽然程序可能会停滞不前,因为纯随机源必须赶上你的随机位消耗。

答案 4 :(得分:0)

听起来您的算法可以从轻微的重新设计中受益,这将使隐式创建随机数而不是使用随机数生成器明确地找到它们。

例如,如果你想得到一个从1到10的随机数字序列,最好从一个有序系列开始,以某种方式混合它,例如通过交换(我认为有一个问题)和把数字一个接一个地拿走。