2015-08-29 43 views
2

我想創建一個沒有任何重複的隨機數組。生成沒有重複的隨機數組

private void SetRandomQuestions() 
{ 
    var idS = from t in _db.QuestionsTables 
       where t.Cat_Id == _catId 
       select new 
        { t.Question_Id }; 

    // to get the questions Id from database table 
    foreach (var variable in idS) 
    { 
     array.Add(variable.Question_Id); 
    } 

    // generate a random numbers depends on the array list values 
    var random = new Random(); 

    for (var i = 0; i < _randomQuestionId.Length; i++) 
    { 
     _randomNumber = random.Next(array.Count); 

     for (var j = 0; j < _randomQuestionId.Length; j++) 
     { 
      if (_randomQuestionId[j] != array[int.Parse(_randomNumber.ToString())]) 
      { 
       _randomQuestionId[i] = array[int.Parse(_randomNumber.ToString())]; 
       j = 5; 
      } 
     } 
    } 
} 

正如你在這裏看到的,我有列表數組有問題id的值,並進一步創建另一個數組,以從該數組中隨機獲得4個元素。 但是,我的問題是我如何獲得沒有任何重複ID的元素我已經嘗試了很多次,但不幸的是我沒有成功。

+1

查找到數組洗牌。 – Matthew

+1

無法標記更多重複項。但有一個愚蠢[這裏](http://stackoverflow.com/questions/13195738/avoiding-random-duplicates)和[這裏](http://stackoverflow.com/questions/14473321/generating-random-unique-values -c-sharp)也[這裏](http://stackoverflow.com/questions/5561742/generate-distinct-random-numbers-in-c-sharp)然後[這裏](http://stackoverflow.com/questions/4299138 /在範圍內產生n個隨機數和唯一數),也可能是其他數十個。 –

+1

爲什麼heck正在將數字轉換爲字符串並返回? ('int.Parse(_randomNumber.ToString())])') –

回答

3

最簡單的事情將是洗牌你的問題ID,然後取前四名。

Random rnd = new Random(); 
randomQuestionId = idS.OrderBy(_ => rnd.Next()).Take(4).ToArray(); 
+1

看到[這個答案](http://stackoverflow.com/questions/1287567/is-using-random-and-orderby-a-good-shuffle-algorithm)一個更有效的方式來洗牌數組(使用[ Fisher-Yates算法](https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle))。 – Suigi

+0

我想是的,這是最簡單的方法 –

0

試試這個,這個代碼將生成唯一的隨機數

result
int smallestNumber = 1; 
int biggestNumber = 50; 

//Determine the amount of random numbers 
int amountOfRandomNumbers = 10; 

//Create a list of numbers from which the routine 
//shall choose the result numbers 
var possibleNumbers = new List<int>(); 
for (int i = smallestNumber; i <= biggestNumber; i++) 
    possibleNumbers.Add(i); 

var result = new List<int>(); 

//Initialize a random number generator 
Random rand = new Random(); 

//For-loop which picks each round a unique random number 
for (int i = 0; i < amountOfRandomNumbers; i++) 
{ 
    //Generate random number 
    int randomNumber = rand.Next(1, possibleNumbers.Count) - 1; 
    result.Add(possibleNumbers[randomNumber]);  
    //Remove the chosen result number from possible numbers list 
    possibleNumbers.RemoveAt(randomNumber); 
} 

//現在循環並打印輸出

0
var pickFour = array 
    .OrderBy(p => Guid.NewGuid()) 
    .Take(4); 
+0

這裏不需要數字操作,GUID只用於隨機化列表並且沒有被選中。 –