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}.