随机生成4个不同的数字

时间:2017-06-16 22:37:12

标签: c# xamarin xamarin.forms

我是Xamarin的新手,

我想随机生成列表中的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)];

    }

如果你有更好的解决方案,我会接受。 感谢

3 个答案:

答案 0 :(得分: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];

答案 1 :(得分: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;
    }

传递到目前为止已创建的数字列表

答案 2 :(得分: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();
        }
    }
}