c#生成不重复的随机数

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/10675211/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-09 14:46:45  来源:igfitidea点击:

generate random numbers with no repeat in c#

c#randomnumbers

提问by Nimait70

How can I generate random numbers with no repeat in C#. I have one array and I want to fill every room with random numbers from 0 to 9. Each room shoud have diffrent numbers. I use this:

如何在 C# 中生成不重复的随机数。我有一个数组,我想用 0 到 9 的随机数填充每个房间。每个房间都应该有不同的数字。我用这个:

for (int i = 0; i < 20; i++)
{
    Random rnd = new Random();
    int temp = 0;
    temp = rnd.Next(0, 9);
    page[i] = temp;
}

But I get same number in evey room's of array.

但是我在每个房间的数组中得到相同的数字。

回答by Joey

With such a small list of numbers to choose from you can simply generate a list that contains all of them and then shufflethem.

有了这么小的数字列表供您选择,您可以简单地生成一个包含所有数字的列表,然后它们打乱

回答by Daniel San

Your problem is that you are creating the Random object in every loop. The Random object must be created only once. Try this instead:

您的问题是您在每个循环中都创建了 Random 对象。Random 对象只能创建一次。试试这个:

Random rnd = new Random(); // <-- This line goes out of the loop        
for (int i = 0; i < 20; i++) {
    int temp = 0;
    temp = rnd.Next(0, 9);
    page[i] = temp;
}

回答by Anoush

100 % right

100% 正确

   public int[] UniqeRandomArray(int size , int Min , int Max ) {

        int [] UniqueArray = new int[size];
        Random rnd = new Random();
        int Random;

        for (int i = 0 ; i < size ; i++) {

            Random = rnd.Next(Min, Max);

            for (int j = i; j >= 0 ; j--) {

                if (UniqueArray[j] == Random)
                { Random = rnd.Next(Min, Max); j = i; }

            }

            UniqueArray[i] = Random;

        }

        return UniqueArray;

    }

// Notice to be unique [Max - Min > size] NOT equal

// 注意是唯一的 [Max - Min > size] 不相等

回答by meysam_rasouli

        ArrayList page=new ArrayList();
        int random_index;            
        random rnd = new Random();

        for (int i = 0; i < 20; i++)
        {
            do                            
            {
                random_index = rnd.Next(10);
                if (!(page.Contains(random_index)))
                                break;
            } while (page.Contains(random_index));
            page.Add(random_index);
        }

回答by user3798696

    public Form1()
    {
        InitializeComponent();
    }
    int A, B;
    string Output;
    private void Form1_Load(object sender, EventArgs e)
    {
        for (int i = 0; i < 20; i++)
        {
            while (A == B)
            {
                Random r = new Random();
                A = r.Next(1, 6);
            }
            Output = Output + A;
            B = A;
        }
        textBox1.Text = Output;
    }

Output: 24354132435213245415 (not repeating)

输出:24354132435213245415(不重复)

回答by Abdulbasit Saidu

using System;

using System.Collections.Generic;

using System.Linq;


namespace nonRepeatableRndm
{

    class Program
    {
        //variable with the Values
        List<string> RandomVal = new List<string>();
        //variable to compare the randomly genarated Values
        List<string> CompaerbyString = new List<string>();
        //Variable that gets Value from  the list Values
        string DisplayVal;
        //instantiates the Random Class
        Random r;
        //this Method gives Value to the list and initializes th the Random Class
        void setVal()
        {
            //Adding to the list
            RandomVal.Add("A");
            RandomVal.Add("b");
            RandomVal.Add("c");
            RandomVal.Add("d");
            RandomVal.Add("e");
            RandomVal.Add("f");
            RandomVal.Add("g");
            RandomVal.Add("h");
            RandomVal.Add("i");
            RandomVal.Add("j");
            RandomVal.Add("k");
            RandomVal.Add("l");
            RandomVal.Add("m");
            RandomVal.Add("n");
            RandomVal.Add("o");
            RandomVal.Add("p");
            RandomVal.Add("q");
            RandomVal.Add("r");
            RandomVal.Add("s");
            RandomVal.Add("t");
            RandomVal.Add("u");
            RandomVal.Add("v");
            RandomVal.Add("w");
            RandomVal.Add("x");
            RandomVal.Add("y");
            RandomVal.Add("z");

            //Instantiating the Random Method
            r = new Random();
        }
        //This method Gives Out the Random Values
        public void DisplayRand()
        {

           //Setting Random Index 
           int getIndex =  r.Next(0, RandomVal.Count - 1);
            //Now we are trying to pass a random value to the String 
            DisplayVal = RandomVal.ElementAt<string>(getIndex);
            //we are testing to see if String in Display is contained in the List that will used Compare
            if (!CompaerbyString.Contains(DisplayVal))
                Console.WriteLine(DisplayVal.ToUpper());
            else
            {
                try
                {
                    this.DisplayRand();
                }
                catch(Exception e)
                {
                    Console.WriteLine("You have Reached the End of the list...");
                    Environment.Exit(0);
                }
            }
            //Adding Corrent DisplayVal's Value to the List for Comparison
            CompaerbyString.Add(DisplayVal);
        }
        //This is Simple method that Calls the Display
        void Call()
        {
            //This For loop is to Ensure we have no Stack Overflow
            for ( int i = 0; i < RandomVal.Count-1;i++)
            {
                this.DisplayRand();

            }
        }
        static void Main(string[] args)
        {
            Console.WriteLine("Random Values With Out Repeatating Any Value");
            //Simple Instantiation
            Program dis = new Program();
            //Simple Call
            dis.setVal();
            //Simple Call
            dis.Call() ;
            Console.ReadLine();   
        }
    }
}

This is the output

这是输出

回答by Gary

This will create a unique range of 1 to rangeEx inclusive. The next two lines create a random number Generator and orders the IEnumerable range with a randome number. this is then called with ToArray and returned!

这将创建一个从 1 到 rangeEx 的唯一范围。接下来的两行创建一个随机数生成器并使用随机数对 IEnumerable 范围进行排序。然后用 ToArray 调用它并返回!

   private int[] RandomNumber(int rangeEx)
    {
        var orderedList = Enumerable.Range(1, range);
        var rng = new Random();
        return orderedList.OrderBy(c => rng.Next()).ToArray();
    }