我知道类似的问题很多,可能没有确定的答案,但是我想从可能无限的数字子集中生成五个唯一的随机数(可能为0-20,或0-1,000,000)。 唯一的问题是我不想运行while循环或填充数组。
while
我当前的方法是简单地从子集中减去最后五个数字生成五个随机数。如果任何数字彼此匹配,则它们将转到子集末尾的相应位置。因此,如果第四个数字与任何其他数字匹配,则将其设置为从最后一个数字开始的第四个数字。
是否有人拥有“足够随机”的方法并且不涉及昂贵的循环或数组?
请记住这是一个好奇心,而不是一些关键任务问题。如果每个人都没有张贴“您为什么遇到这个问题?”,我将不胜感激。答案。我只是在寻找想法。 非常感谢!
一个随机号码就足够了。
如果要在1-n范围内选择5个唯一数字的子集,请在1到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}
现在5选择2是10。
因此,我们从1到10中选择一个随机数。假设我们得到8。现在,我们按上述顺序生成第8个元素:给出{3,4},所以您想要的两个数字是3和4。
我链接到的msdn页面显示了给定编号的生成集合的方法。即给定8,它会返回集合{3,4}。