2012-05-21 21 views
0

我想,以填補我的數組在C# 0-9之間唯一的隨機數我試試這個功能:填充在C#中與0-9之間潮頭隨機數的數組

IEnumerable<int> UniqueRandom(int minInclusive, int maxInclusive) 
    { 
     List<int> candidates = new List<int>(); 
     for (int i = minInclusive; i <= maxInclusive; i++) 
     { 
      candidates.Add(i); 
     } 
     Random rnd = new Random(); 
     while (candidates.Count > 1) 
     { 
      int index = rnd.Next(candidates.Count); 
      yield return candidates[index]; 
      candidates.RemoveAt(index); 
     } 
    } 

而且我使用它像這樣的:

for (int i = 0; i < 3; i++) 
{ 
    page[i] = UniqueRandom(0, 9); 
} 

但我得到的錯誤:

Cannot implicitly convert type 'System.Collections.Generic.IEnumerable<int>' to 'int' 

我還添加了這個名字空間:

using System.Collections.Generic; 

我只是不知道我怎麼能轉換函數輸出爲int ...請幫我...謝謝...

+1

您將頁面聲明爲一個int數組,而不是IEnumerable 數組... –

回答

1

你可以這樣做:

int i = 0; 
foreach (int random in UniqueRandom(0, 9).Take(3)) 
{ 
    page[i++] = random; 
} 
4

你好得多做這樣的事情,使用Fischer-Yates shuffle

public static void Shuffle<T>(this Random rng, IList<T> list) 
{ 
    int n = list.Count; 
    while (n > 1) { 
     n--; 
     int k = rng.Next(n + 1); 
     T value = list[k]; 
     list[k] = list[n]; 
     list[n] = value; 
    } 
} 

用法:

var numbers = Enumerable.Range(0, 10).ToList(); // 0-9 inclusive 
var rng = new Random(); 
rng.Shuffle(numbers); 
int[] page = numbers.Take(3).ToArray(); 
+0

@dtb爲什麼要改變這個,作爲Random()的擴展? –

+4

使用Random類時要避免[常見的陷阱](http://stackoverflow.com/questions/767999)。 – dtb

+0

但隨機是在方法內部聲明的 - 從而避免了這種情況.... –

2

您的方法返回一個枚舉值,但您嘗試分配一個值。分配中的所有值一個步:

int[] page = UniqueRandom(0, 9).Take(3).ToArray(); // instead of your loop 

編輯:從您的意見,我判斷,你可能複製你對我們的代碼不理解它。也許你想用隨機數字來填充陣列,並且可能重複(例如1, 6, 3, 1, 8, ...)?您當前的代碼僅使用每個值一次(因此名稱唯一),因此您無法用它填充大於10的數組。

如果你只是想要簡單的隨機數,根本就不需要這種方法。

var rnd = new Random(); 

// creates an array of 100 random numbers from 0 to 9 
int[] numbers = (from i in Enumerable.Range(0, 100) 
       select rnd.Next(0, 9)).ToArray(); 
+0

如果我想用0-9之間的隨機數填充我的數組(數組大小= 100),那麼該怎麼辦......我也不想讓所有數組空間都填充相同的數字 – Nimait70

+0

@ Nimait70:這段代碼不會填滿你的數組使用相同的數字,它將填充三個不同的數字。我不明白你關於數組大小100的問題:從0到9只有10 *個唯一*數字。你怎麼能用它們填充一個大小爲100的數組? (你會去,例如'{5,2,7,4,1,3,0,8,9,6,...',然後你就沒有唯一的號碼了!) – Heinzi

+0

@ Nimait70:我'我改變了我的答案,請檢查它是否適用於您的問題。 – Heinzi

0

我的數組是太大了,我需要很多的隨機數...當我用

int[] page = UniqueRandom(0, 9).Take(arraysize).ToArray(); 

它給了我到底9獨一無二的隨機數..

和我得到這個錯誤(例如對於數組大小= 15):

index was outside of bounds of array 

我怎麼能有一個數組與過多的0-9之間的隨機數機智豪特重複?

+0

這沒有意義,你只能在0-9之間有10個唯一的數字,因爲那是...... 10個數字。你想達到什麼目的? – climbage

+0

@climbage:我想在0-9之間有太多的隨機數組而沒有重複所有的時間...有時可以重複有時,但我不想所有的數組空間填充相同的數字 – Nimait70

+0

@ Nimait70 - 我是這裏有點困惑。你是否想把這個添加到你的問題中?這看起來不像是對我的回答。你可以編輯你的問題。 –