【发布时间】:2012-01-21 13:44:11
【问题描述】:
在我的一个项目中,我遇到了在给定范围内生成一组数字的需求,这些数字将是:
详尽无遗,这意味着它将涵盖给定的大部分内容 范围没有任何重复。
它将保证确定性(每次序列都是 相同的)。这可以通过固定种子来实现。
它将是随机的(我不是很精通随机数理论,但我猜有一堆描述随机性的规则。从角度来看,像 0,1,2..N 不是随机的) .
我所说的范围可以是整数范围,也可以是实数范围。
例如,如果我使用标准 C# 随机生成器在 [0, 9] 范围内生成 10 个数字,我会得到:
0 0 1 2 0 1 5 6 2 6
如您所见,给定范围的很大一部分仍然“未探索”并且有很多重复。
当然,输入空间可能非常大,因此记住以前选择的值不是一种选择。
解决这个问题的正确方法是什么?
谢谢。
在cmets之后: 好的,我同意随机不是正确的词,但我希望你理解我想要实现的目标。我想探索可能很大的给定范围,因此在内存列表中不是一个选项。如果一个范围是 (0, 10) 并且我想要三个数字,我想保证这些数字会不同并且它们将“描述范围”(即它们不会都在下半部分等)。
确定性部分意味着我想使用带有固定种子的标准 rng 之类的东西,所以我可以完全控制序列。
我希望我把事情说得更清楚了。
谢谢。
【问题讨论】:
-
随机就是随机,不想重复就不要随机
-
对于从 1 到 10 的十个 真正 随机数,您预计大约有三个重复数和大约三个缺失数。如果您不想允许重复,则不需要真正的随机数。谷歌的生日悖论。
-
determinism和random不能一起使用。随机意味着你无法预测它,而确定性意味着知道完整的前一个“周期”你可以预测它。 -
您可以轻松地生成“不重复的随机数”,其数组长度为
n和“惰性随机播放”(即从“not-数组的“已看到”部分与“未看到”部分的最后一个元素,将“未看到”部分缩小一) -
@ranty 好的,但伪随机和确定性可以一起使用 :)