2012-01-19 93 views
3

我記得看到一個方法似乎佈雷排序,哪裏可以unsort項目。你知道一個方法來取消列表或數組嗎?

例如,我試圖表現出隨機的項目從0到10,使用Random類。但我猜並不是最好的選擇。

所以,我想創造IEnumberable,列表或陣列的擴展,無論可以是一個最好的辦法。

+0

什麼是你的使用情況? – ken2k

+0

[最佳LINQ查詢獲取隨機子集合 - 隨機]的可能重複(http://stackoverflow.com/questions/1651619/optimal-linq-query-to-get-a-random-sub-collection-shuffle) –

+0

你是指從0到10的項目是什麼意思?前10個項目?一個大小爲10的列表? –

回答

-3

你可以使用LINQ ...

var result = Enumerable.Range(0,10).OrderBy(n=> Guid.NewGuid()) 
+0

除了LINQ的'OrderBy' /'ThenBy'使用快速排序引擎蓋下,給它爲O(n log n)的性能(平均情況),更不用說需要額外的空間。 「標準」洗牌算法是O(n),不需要額外的空間。 –

+1

不,不要使用它。 http://blogs.msdn.com/b/ericlippert/archive/2011/01/31/spot-the-defect-bad-comparisons-part-four.aspx –

+0

@LB,OrderBy是穩定的,它不會遭受從與列表上的排序方法相同的缺點。對於一個小序列的快速一次性洗牌,使用OrderBy並不可怕,但更好的算法肯定會更具可擴展性。 –

0

這會給你一個隨機值從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; 
} 
+0

這不是'基本上'費希爾 - 耶茨,它是從列表中隨機選擇的。它的共同之處在於它是公平的,沒有偏見的。這也是O(n^2)運行時。 –

+0

你爲什麼在這樣一種奇怪的方式中隨着時間播種隨機課?隨機類自動使用當前時間自行播種。 –

+0

尼克當然是正確的;如果清單很大,這是非常低效的。 –

7

,看起來像冒泡排序將是算法:

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比特。

+1

如果你提到這是Fisher-Yates shuffle,它可能會有所幫助。 –

-3

有趣的問題, 我提出離開工作崗位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); 
+1

999有什麼特別之處? –

相關問題