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
generate random numbers with no repeat in c#
提问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
回答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();
}
}
}
回答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();
}


