问题描述
径的阵列n个元素:{1,2,3,... n}的。洗牌使用任何随机洗牌阵列的标准算法的数组。修改后的数组的第N个元素就是你所期待的。
Take an array of n elements: { 1, 2, 3, .... n }. Shuffle the array using any of the standard algorithms of randomly shuffling arrays. The first N elements of the modified array is what you are looking for.
只需使用 Random.Next()
在一个循环,并检查是否已存在或者未在词典
,直到我们有N个。
Simply use Random.Next()
in a loop and check if it already exists or not in an Dictionary
, until we have N numbers.
请注意,N'LT;< N(N是小于n非常小)
Notice that N << n ( N is very smaller than n)
推荐答案
部分费雪耶茨,一些调整*:
Partial Fisher-Yates, with some tweaks*:
Algorithm产生1000不同的整数的范围为[0,8000]
&安培;
Algorithm选择一个单一的,随意组合价值?
*这里主要的外卖是,内存使用量减少,所以现在是成正比的项目数的选择的最多的项目数量不限的选择。这可以提供巨大的节能,如果 N'LT;&LT; ñ
(正如你所提到的)。 (使用空间的上限是为O(n / 2),不管作如何收盘为n。)
运行时间为O(N)。
除此之外,它是一个相当常用的部分费雪耶茨,又名克努特洗牌。
这篇关于这些算法是在性能和更好的顺序用于生成1..N范围n独特的随机数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!