2017-06-21 103 views
-2

如果我有一個包含一些值的數組。如何每次獲得不同的隨機數 - 代表索引 - 從數組中獲取不同的值?如何在C#中每次選擇不同的隨機數

+0

您是否嘗試從可用位置列表中刪除所選結果,然後從其餘位置隨機選取? – phuzi

+3

不要「生成」隨機數字。收集所有可能的數字並洗牌。然後枚舉混洗的數字。 - 'foreach(int randomIndex in Enumerable.Range(0,5).OrderBy(rnd.Next())){[...]}'可能是一個開始。 – Corak

+1

@phuzi:我不能,因爲我需要在不同的方法這個數組 – Rose

回答

0

生成您需要的範圍序列,並隨機排序。然後,將這些值放入堆棧並從堆棧中選擇。例如:

var rnd = new Random(); 
var randomValues = new Stack<int>(Enumerable.Range(0,5).OrderBy(x => rnd.Next())); 
var randomIndex1 = randomValues.Pop(); 
var randomIndex2 = randomValues.Pop(); 
+0

爲什麼你重新打開這個問題(之前已被封閉作爲重複),只是發佈一個答案,提出[一個次優解決方案](https ://stackoverflow.com/questions/1287567/is-using-random-and-orderby-a-good-shuffle-algorithm)?這看起來有點像濫用我的金牌標誌特權。你能解釋爲什麼你不同意這個問題是[this one](https://stackoverflow.com/questions/9592166/unique-number-in-random)和[this one](https:// stackoverflow。 COM /問題/ 26931528 /隨機數發生器與 - 無重複)? –

+0

@CodyGray是的,你說的沒錯,我想我有點急於重新打開這個問題。我雖然在重複問題中的頂部答案只是洗牌數組,但它也填補了它。所以是的,與我的答案唯一的區別僅僅是我也顯示了一個簡單的方法來使用堆棧選擇值。 – Magnus

+0

很酷。感謝回覆。我在這裏得到了一些關於可疑行爲的標誌,並且想要給你一個提醒。在未來,它可能會更好地具體提到你的答案是增加了,而不是被提出的副本中的答案覆蓋(就像我們要求提問者在他們的問題中澄清他們是否抗議重複封閉)。 –