2017-06-16 42 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