Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/260.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# 随机化数组列表_C#_Collections_Arraylist_Shuffle - Fatal编程技术网

C# 随机化数组列表

C# 随机化数组列表,c#,collections,arraylist,shuffle,C#,Collections,Arraylist,Shuffle,我试图制作一个loto数字生成器程序,输出6个唯一的随机数。 我以前使用collections.shuffle方法在java中实现过这一点。我在c中找不到这样的方法。我看到唯一可用的方法是随机方法。我尝试在代码中使用此方法,但它不会生成唯一的随机数。有时is会在我的loto number程序中生成重复的数字。我已经把我的代码的副本放在这里让你看一看,并为你评论了它,这样你就可以看到我正在尝试做什么。谢谢 static void Main(string[] args) {

我试图制作一个loto数字生成器程序,输出6个唯一的随机数。 我以前使用collections.shuffle方法在java中实现过这一点。我在c中找不到这样的方法。我看到唯一可用的方法是随机方法。我尝试在代码中使用此方法,但它不会生成唯一的随机数。有时is会在我的loto number程序中生成重复的数字。我已经把我的代码的副本放在这里让你看一看,并为你评论了它,这样你就可以看到我正在尝试做什么。谢谢

    static void Main(string[] args)
    {
        Random number = new Random();// object to randomize the arraylist ,LIST.
        ArrayList list = new ArrayList();
        for (int i = 1; i <= 49; i++) // Loop to populate the arraylist with int values from 1 to 49.
        {
            list.Add(i);
            Console.WriteLine(number.Next(i)); // Output the contents of the arraylist in a randome order. (This produces duplicat numbers.
            // I am trying to produce a loto number generator program. No duplicat numbers. Each random number must be unique.
        }
        for (int i = 1; i <= 6; i++)// This loop was going to be used to trip the ammount of random numbers displayed.
        {

检查ArrayList中是否包含随机数

    var rnd = new Random();

    var list = new ArrayList();

    while (list.Count <= 6)
    {
        int t = rnd.Next(1, 49);
        while (list.Contains(t))
        {
            t = rnd.Next(1, 49);
        }

        list.Add(t);
    }

您可以使用Fisher-Yates洗牌算法和随机数生成器洗牌数组:

static void Shuffle(ref ArrayList list)
{
    Random rng = new Random();

    for (int i = list.Count - 1; i >= 0; i--)
    {
        // Note: It's important to only select a number into each index
        // once. Otherwise you'll get bias toward some numbers over others.
        int number = rng.Next(i); // Choose an index to swap here
        Swap(ref list[i], ref list[number]) // Swap it
    }
}

static void Swap(ref int first, ref int second)
{
    int temp = first;
    first = second;
    second = temp;
}

static void Main(string[] args)
{
    ArrayList list = new ArrayList();
    for(int i = 1; i <= 49; i++)
    {
        list.Add(i);
    }
    Shuffle(ref list);

    for (int i = 1; i <= 6; i++)
    {
        // Use the shuffled list
    }
}
不过,如果您只想选择六个唯一的随机数,则不需要对数组进行洗牌。您只需跟踪以前生成的数字,如果得到重复的数字,则可以重新生成下一个数字

static ArrayList GetUniqueRandomNumbers(int min, int max, int count)
{
    Random rng = new Random();
    ArrayList result = new ArrayList();

    while(ArrayList.Count < count)
    {
        int number = rng.Next(min, max);

        // Only add if it hasn't been generated yet
        if (!result.Contains(number))
        {
            result.Add(number);
        }
    }
}

static void Main(string[] args)
{
    ArrayList loto = GetUniqueRandomNumbers(1, 49, 6);

    for (int i = 1; i <= 6; i++)
    {
        // Use the generated numbers
    }
}

有很多解决方案,如何在列表或数组中重新排序数字。您可以:生成数字列表1..49,重新排序集合,取前6个。我的扩展方法:似乎非常接近。注意+1可能有一个比洗牌更好的方法。不过,您可能希望更清楚地了解这样一个事实,即您正在对同一个问题采取非洗牌方法。这可能会让你落选。