2017-06-16 36 views
1

我在Xamarin新手,生成4個型動物數量隨機

我想隨機產生4個數字,其在列表中,這4個數字必須是不同的。

在下面的例子中,我有一個ID列表,我試圖在列表中隨機選擇4個ID,這4個ID必須是每個不同的。

這裏是我的梅索德,我不知道怎樣才能繼續使之簡單:

public MyWordsList() 
      { 
       InitializeComponent(); 


       Dictionary<int, int> WordId = new Dictionary<int, int>(); 
       int u= 0; 
       // TestAnswer.IsVisible = false; 
       foreach (var w in mywords) 
       { 
        WordId[u] = w.ID; 
        u++; 
       } 

       Random rnd = new Random(); 
// this is not ok because I can have the same number 
       word11.Text = WordsList[rnd.Next(1, 20)]; 
       word12.Text = WordsList[rnd.Next(1, 20)]; 
       word13.Text = WordsList[rnd.Next(1, 20)]; 
       word14.Text = WordsList[rnd.Next(1, 20)]; 

    } 

如果你有一個更好的解決方案,我會抓住。 感謝

+0

HTTPS:/ /stackoverflow.com/a/43592646/1744164 –

+0

可能的重複[如何隨機用3個不同的字符串填充數組?](https://stackoverflow.com/questions/43592102/how-can-i-randomly-fill -an-array-with-3-different-strings) –

回答

2

你可以寫一個挑選的從指定的集合隨機和獨特的項目X量和返回它們短泛型函數:

private static IEnumerable<T> GetUniqueRandomItems<T>(int count, IList<T> allItems) 
{ 
    if (new HashSet<T>(allItems).Count < count) 
    { 
     throw new ArgumentException(nameof(allItems)); 
    } 
    Random random = new Random(); 
    HashSet<T> items = new HashSet<T>(); 
    while (items.Count < count) 
    { 
     T value = allItems[random.Next(0, allItems.Count)]; 
     items.Add(value); 
    } 
    return items; 
} 

以後,您可以使用它像這樣:

string[] randomIds = GetUniqueRandomItems(4, WordsList).ToArray(); 
word11.Text = randomIds[0]; 
word12.Text = randomIds[1]; 
word13.Text = randomIds[2]; 
word14.Text = randomIds[3]; 
+0

謝謝,但是這不起作用它阻止了程序 – hugo

+0

@hugo我更新了答案,如果它仍然不起作用,請告訴我你是如何調用該方法的。 – Deadzone

+0

這裏是我如何做:var id = mywordsdatabase.SelectWords(); int [] randomIds = GetUniqueRandomItems(4,id).ToArray(); – hugo

0

呼叫像下面這樣的方法:

private int CreateUniqueRandom(int min, int max, ICollection<int> existingNums) 
    { 
     var rnd = new Random(); 
     var newNum = rnd.Next(min, max); 

     while (existingNums.Contains(newNum)) 
      newNum = rnd.Next(min, max); 

     return newNum; 
    } 

霸通過您所創建的號碼列表ssing到目前爲止

+0

謝謝我有蜜蜂試圖把它放在一個列表中,但沒有成功,我試過了:var idd = CreateUniqueRandom(10,20,Ids.ToList()); – hugo

0

你可能不會需要這個,但只是爲了顯示獨特的隨機數生成的方法,沒有重複的檢查:

using System; 
using System.Collections.Generic; 
using System.Linq; 

namespace ConsoleApp1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      var randoms = GenerateRandoms(10, 1, 10).OrderBy(v => v); 
      foreach (var random in randoms) 
      { 
       Console.WriteLine(random); 
      } 

      Console.ReadLine(); 
     } 

     private static int[] GenerateRandoms(int randomCount, int min, int max) 
     { 
      var length = max - min + 1; 
      if (randomCount > length) { throw new ArgumentException($"Cannot generate {randomCount} random numbers between {min} and {max} (inclusive)."); } 

      var values = new List<int>(length); 
      for (var i = 0; i < length; i++) 
      { 
       values.Insert(i, min + i); 
      } 

      var randomGenerator = new Random(); 
      var randoms = new List<int>(); 
      for (var i = 0; i < randomCount; i++) 
      { 
       var val = randomGenerator.Next(0, values.Count); 
       randoms.Add(values[val]); 
       values.RemoveAt(val); 
      } 

      return randoms.ToArray(); 
     } 
    } 
} 
+0

感謝您的信息 – hugo