来自子集的五个唯一的随机数

tau*_*tau 4 php random algorithm

我知道类似的问题出现了很多,而且可能没有确定的答案,但我想从一个可能无限的数字子集中生成五个唯一的随机数(可能是0-20,或0-1,000,000).
唯一的问题是我不想运行while循环或填充数组.

我目前的方法是简单地从子集中减去最后五个数字生成五个随机数.如果任何数字彼此匹配,则它们将在子集的末尾到达它们各自的位置.因此,如果第四个数字与任何其他数字匹配,则它将从最后一个数字下注设置为第4个.

有没有人有一个"足够随机"的方法,并且不涉及昂贵的循环或数组?

请记住这是一个好奇心,而不是一些关键任务问题.如果每个人都没有发帖"你为什么会遇到这个问题?"我将不胜感激.答案.我只是在寻找想法.
非常感谢!

小智 8

一个随机号码就足够了.

如果要在1-n范围内选择5个唯一数字的子集,则在1到(n选择r)中选择一个随机数.

保持从1到(n选择r)的1-1映射到可能的5个元素子集的集合,您就完成了.这种映射是标准的,可以在网上找到,例如:http://msdn.microsoft.com/en-us/library/aa289166%28VS.71%29.aspx

举个例子:

考虑从五个数字生成两个数字的子集的问题:

{1,...,5}的可能的2个元素子集是

1. {1,2}
2. {1,3}
3. {1,4}
4. {1,5}

5. {2,3}
6. {2,4}
7. {2,5}

8. {3,4}
9. {3,5}

10. {4,5}
Run Code Online (Sandbox Code Playgroud)

现在5选2是10.

所以我们从1到10中选择一个随机数.假设我们得到8.现在我们在上面的序列中生成第8个元素:得到{3,4},所以你想要的两个数字是3和4.

我链接到的msdn页面显示了一个生成集合的方法,给定数字.即给定8,它返回集合{3,4}.

  • 10000选择5是832500291625002000,比PHP_INT_MAX大.但是,有趣的答案+1. (2认同)