Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 随机生成4个不同的数字_C#_Xamarin_Xamarin.forms - Fatal编程技术网

C# 随机生成4个不同的数字

C# 随机生成4个不同的数字,c#,xamarin,xamarin.forms,C#,Xamarin,Xamarin.forms,我是Xamarin的新手 我想随机生成列表中的4个数字,这4个数字必须不同 在下面的示例中,我有一个id列表,我试图在列表中随机选取4个id,这4个id必须各不相同 这是我的方法,我看不出我如何继续并使其简单化: public MyWordsList() { InitializeComponent(); Dictionary<int, int> WordId = new Dictionary

我是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)];

    }
publicMyWordsList()
{
初始化组件();
字典WordId=新字典();
int u=0;
//TestAnswer.IsVisible=false;
foreach(以mywords表示的var w)
{
WordId[u]=w.ID;
u++;
}
随机rnd=新随机();
//这不好,因为我可以有相同的号码
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)];
}
如果你有更好的解决方案,我会采取。
谢谢

您可以编写一个简短的通用函数,从指定集合中选择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;
}

调用如下所示的方法:

    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;
    }
private int-CreateUniqueRandom(int-min、int-max、ICollection-existingNums)
{
var rnd=新随机数();
var newNum=rnd.Next(最小值、最大值);
while(existingNums.Contains(newNum))
newNum=rnd.Next(最小值、最大值);
返回newNum;
}

通过到目前为止创建的数字列表,您可能不需要这个,只需显示一种无重复检查的唯一随机数生成方法:

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();
        }
    }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
名称空间控制台EAPP1
{
班级计划
{
静态void Main(字符串[]参数)
{
var randoms=生成域(10,1,10).OrderBy(v=>v);
foreach(随机变量中的随机变量)
{
控制台写入线(随机);
}
Console.ReadLine();
}
私有静态int[]生成器域(int-randomCount、int-min、int-max)
{
变量长度=最大值-最小值+1;
如果(randomCount>length){抛出新的ArgumentException($“无法在{min}和{max}(包括)}之间生成{randomCount}随机数)。”;}
var值=新列表(长度);
对于(变量i=0;i
可能重复感谢,但这不起作用。请阻止program@hugo我更新了答案,如果仍然不起作用,请告诉我如何调用该方法;int[]randomIds=GetUniqueRandomItems(4,id).ToArray();my methods://Select words public List SelectWords(){var ID=(从conn.Table()中的w选择w.ID);返回Ids.ToList();}
T value=allItems[random.Next(1,allItems.Count)]应该是
T值=allItems[random.Next(0,allItems.Count)]否则它将永远不会选择第一个条目(在索引0处)。谢谢,我尝试将其放入列表中,但没有成功,我尝试了:var idd=CreateUniqueRandom(10,20,Ids.ToList());
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();
        }
    }
}