如何在排除某些范围的同时生成范围内的随机数。例如。范围1-10但不是2-4或7。 到目前为止我用过的解决方案:
你的解决方案是什么?
答案 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的随机数字序列,最好从一个有序系列开始,以某种方式混合它,例如通过交换(我认为有一个问题)和把数字一个接一个地拿走。