一尘不染

子集中的五个唯一的随机数

algorithm

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

我当前的方法是简单地从子集中减去最后五个数字生成五个随机数。如果任何数字彼此匹配,则它们将转到子集末尾的相应位置。因此,如果第四个数字与任何其他数字匹配,则将其设置为从最后一个数字开始的第四个数字。

是否有人拥有“足够随机”的方法并且不涉及昂贵的循环或数组?

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


阅读 235

收藏
2020-07-28

共1个答案

一尘不染

一个随机号码就足够了。

如果要在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}。

2020-07-28