我記得看到一個方法似乎佈雷排序,哪裏可以unsort項目。你知道一個方法來取消列表或數組嗎?
例如,我試圖表現出隨機的項目從0到10,使用Random類。但我猜並不是最好的選擇。
所以,我想創造IEnumberable,列表或陣列的擴展,無論可以是一個最好的辦法。
我記得看到一個方法似乎佈雷排序,哪裏可以unsort項目。你知道一個方法來取消列表或數組嗎?
例如,我試圖表現出隨機的項目從0到10,使用Random類。但我猜並不是最好的選擇。
所以,我想創造IEnumberable,列表或陣列的擴展,無論可以是一個最好的辦法。
你正在尋找一個洗牌,對於隨機重新排序一個很好的例子是Fisher-Yates Shuffle。
你可以使用LINQ ...
var result = Enumerable.Range(0,10).OrderBy(n=> Guid.NewGuid())
除了LINQ的'OrderBy' /'ThenBy'使用快速排序引擎蓋下,給它爲O(n log n)的性能(平均情況),更不用說需要額外的空間。 「標準」洗牌算法是O(n),不需要額外的空間。 –
不,不要使用它。 http://blogs.msdn.com/b/ericlippert/archive/2011/01/31/spot-the-defect-bad-comparisons-part-four.aspx –
@LB,OrderBy是穩定的,它不會遭受從與列表上的排序方法相同的缺點。對於一個小序列的快速一次性洗牌,使用OrderBy並不可怕,但更好的算法肯定會更具可擴展性。 –
這會給你一個隨機值從0到10(含10):
int[] randomNumbers = Shuffle(Enumerable.Range(0, 11), new Random()).ToArray();
public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random random)
{
T[] list = source.ToArray();
int count = list.Length;
while (count > 1)
{
int index = random.Next(count--);
T temp = list[index];
list[index] = list[count];
list[count] = temp;
}
return list;
}
這不是'基本上'費希爾 - 耶茨,它是從列表中隨機選擇的。它的共同之處在於它是公平的,沒有偏見的。這也是O(n^2)運行時。 –
你爲什麼在這樣一種奇怪的方式中隨着時間播種隨機課?隨機類自動使用當前時間自行播種。 –
尼克當然是正確的;如果清單很大,這是非常低效的。 –
,看起來像冒泡排序將是算法:
for i= 0:(len(x)-1):
j = random(i,len(x)-1)
swap(x[i],x[j])
假定隨機的(A,b)返回一個隨機整數C如一個< = C < = b。
而且,這種算法被稱爲「Fisher Yates Shuffle」。
FWIW,你不能「真正」洗牌大陣與標準內置的隨機數生成器。 21項混洗具有65比特的熵,其中大多數RNG是64比特或32比特。
如果你提到這是Fisher-Yates shuffle,它可能會有所幫助。 –
有趣的問題, 我提出離開工作崗位LINQ:
IEnumerable<int> list = new List<int> { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
Random rnd = new Random();
list = list.Select(i => new { value = i, rank = rnd.Next(list.Count()) }).OrderBy(n => n.rank).Select(n => n.value);
999有什麼特別之處? –
什麼是你的使用情況? – ken2k
[最佳LINQ查詢獲取隨機子集合 - 隨機]的可能重複(http://stackoverflow.com/questions/1651619/optimal-linq-query-to-get-a-random-sub-collection-shuffle) –
你是指從0到10的項目是什麼意思?前10個項目?一個大小爲10的列表? –