2012-05-20 17 views
0

Как я могу генерировать случайные числа без повторения в C#. У меня есть один массив, и я хочу заполнить каждую комнату случайными числами от 0 до 9. В каждом номере есть разные номера. Я использую это:генерировать случайные числа без повторения в C#

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

Но я получаю такое же число в массиве evey room.

+1

«Я просто хочу знать, как я могу генерировать случайные числа без повторения в C#?» - Это невозможно. Случайное число, как предполагается, повторяет в противном случае его фактически не генератор случайных чисел, а уникальный генератор значений, который является треугольником для кода. Ваш код также ошибочен, потому что вы всегда будете иметь одинаковое начальное значение. –

+0

Вы говорите о комнатах, но имеете массив страниц !? Вы имеете в виду, что каждая запись на странице массива должна быть уникальной? Понимаю ли вы, что вы хотите, чтобы вы указали 20 цифр на странице, и все ли различны? –

ответ

5

С таким небольшим списком номеров на выбор можно просто сгенерировать список, содержащий все из них, а затем shuffle их.

3

Ваша проблема заключается в том, что вы создаете объект 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; 
} 
-2

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; 

    } 

// Уведомление должно быть уникальным [Max - Min> размер] НЕ равен

+0

Кроме того, это не совсем эффективно для большого массива, вместо этого вы можете создать отсортированный массив и использовать один метод перетасовки для создания случайности – Anoush

-1
 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); 
     } 
+0

Можете ли вы объяснить свой ответ немного больше? – Benvorth

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

Выход: 24354132435213245415 (не повторяется)

-1
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

+0

i Надеюсь, что это поможет –

0

Это создаст уникальный диапазон от 1 до rangeEx включительно. Следующие две строки создают генератор случайных чисел и заказывают диапазон IEnumerable с номером randome. это затем вызывается с ToArray и возвращается!

private int[] RandomNumber(int rangeEx) 
    { 
     var orderedList = Enumerable.Range(1, range); 
     var rng = new Random(); 
     return orderedList.OrderBy(c => rng.Next()).ToArray(); 
    } 
Смежные вопросы