简体   繁体   中英

generate random numbers with no repeat in c#

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:

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.

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

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 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;
}

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!

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

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();   
        }
    }
}

这是输出

100 % right

   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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM