![]() |
1
8
一个随机号码呼叫就足够了。 如果要选择范围1-n中5个唯一数字的子集,请选择1到(n选择r)中的随机数字。 保持从1到(n选择r)的1-1映射到可能的5元素子集集,这样就完成了。此映射是标准的,可以在Web上找到,例如: http://msdn.microsoft.com/en-us/library/aa289166%28VS.71%29.aspx 举个例子: 考虑从五个数字中生成两个数字的子集的问题: _1,…,5的可能2元素子集是
现在5选择2等于10。 所以我们选择一个从1到10的随机数。说我们得了8。现在我们按照上面的顺序生成第8个元素:它给出3,4,所以您需要的两个数字是3和4。 我链接到的msdn页面向您展示了一个生成集合的方法,给出了这个数字。即给定8,则返回集合3,4。 |
![]() |
2
4
您的最佳选择是循环,如:
对于小范围,可以使用
您还可以生成一个介于0和max之间的数字,另一个介于0和max-1之间的数字,…介于0和max-4之间。然后将x和为第n个生成的数字,其中x是按这种方式计算的数字:
映射如下: 1 2 3 4 5 6 7 8 9 (take 4) 1 2 3 4 5 6 7 8 9 (gives 4) 1 2 3 4 5 6 7 8 (take 5) 1 2 3 5 6 7 8 9 (gives 6) 1 2 3 4 5 6 7 (take 6) 1 2 3 5 7 8 9 (gives 8) 1 2 3 4 5 6 (take 5) 1 2 3 5 7 9 (gives 7) example, last extraction: x = 5 x >= 4? x == 6 x >= 6? x == 7 x >= 8? x == 7 |
![]() |
3
2
这个问题的一般形式真的很有趣。应该从一个元素池中选择(并将它们从池中删除)还是应该在点击一个已经占用的元素时循环? 据我所知,Random.sample的python库实现 运行时选择 这两种方法之间的比例取决于输入列表的大小和要选择的元素的数目。 源代码中的注释:
但是,在OP提到的特定实例中(选择5个数字),我认为循环“同时命中所取的数字”是可以的,除非伪随机生成器被破坏。 |
![]() |
4
0
既然你只是在寻找不同的想法,这里有一个: 呼喊 Random.org 生成所需的一组随机数。 |
![]() |
5
0
如果你知道大小n,那么保持每个数字的概率为5/n,生成一个介于0和1之间的随机数,如果它小于5/n,则保持该项。当我们有5件物品时停止。 如果我们不知道使用 resorvoir sampling . |
![]() |
6
0
Artefactor上述第二个解决方案在C中的实现,作为ICollection的助手和扩展方法:
|
![]() |
Karlo · PHP Sqlite PDO最新版本 5 月前 |
![]() |
Malte · 检查远程服务器上是否存在文件(使用PHP)[关闭] 5 月前 |
![]() |
Bard.Mus · 迁移后的数据库字符集环境 6 月前 |