如何让C#产生不重复的随机数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何让C#产生不重复的随机数相关的知识,希望对你有一定的参考价值。

这个问题在CSDN、StackOverFLow上都有相关内容,最后的结论是同样的,即:
“随机数 和 不重复 是相悖的两个概念”。因此这个问题理论上无解。

随机数,(一般C#中)指的是随机生成的一个整型或者浮点型数字。
不重复,指的是在一个数组中,每个元素都有唯一性。

(我们比方说,要生成10个不重复的随机数)
如果在一个范围内生成多个随机数, 那么肯定是会有生成“重复”的几率, 如果要做到不重复,1、要么每次生成时,对范围进行重新判定,
2、要么是生成后,比对已生成的数据,如果相同就重新生成。
无论哪一种做法,都可以实现“生成一组看似随机的不重复数据”,但是这个不能叫“随机数”。
1、的做法是指定新范围,从边界规避掉重复的可能性,所以这一组10个数据其实取值范围是不同的,因为不能叫做“同一组随机数”。
2、的做法其实是会生成重复随机数的, 只是我们把它过滤掉了,因此也不是“不重复随机数”。

所以这个问题如果不去钻牛角尖,有这么两种简单做法去实现,如果严谨的去探讨,其实是个悖论。
参考技术A 如果你的随机数是整数,那么不可能不重复。随机数的产生次数,超过了整数的范围,必然会出现重复。如果不考虑范围的问题,每次产生随机数后,把它记下来,用于检查下次随机数是否重复。
如果不是整数,你可以用GUID来避免重复
参考技术B static double buf = 0.5;
private static double ran()

double num = 0.1;
do
Random ranNum = new Random();
num = ranNum.NextDouble();

while (Math.Abs(num - buf) < 0.000001);
buf = num;
return (num);

//0.00001表示接近于0的实数(伊普斯龙)
//主程序调用 ran()即可,例如: r=ran();
==================分割线====================
如果程序较小:可以如下
private static double ran()

Random ranNum = new Random();
double num = ranNum.NextDouble();
Thread.Sleep(20);
return(num);
参考技术C 要不重复的话,就用GUID类把
Guid g = Guid.NewGuid(); //创建一个Guid的对象

Console.WriteLine(g.ToString());//然后ToString() 你用控制台输出看看,这种随机产生的十六进制数字,会重复的几率几乎没有。

C#中如何产生随机字符串

如何例用C#产生 A到Z 数字0到9 两种组和之间的随机字符串 要求是
第次不能重复 而且每次都要有 数字和字母两者 字数是 20位
我想要的是 两次产生 或是多次产生的串列 没有相同的 而不是单次里面没有重复的字符 但是一定要是数字和字母都有的 这样我想你搞起来会更简单吧 呵呵

loop:
List<string> strList = new List<string>();//创建一个存放A到Z,0到9的字符串列表
for (int i = 65; i <= 90; i++)

char aa =(char) i;
strList.Add(aa.ToString());//把A到Z放到列表中

char[] number=new char[10];//把0到9字符存入字符数组中
for (int i = 48; i <= 57; i++)

char aa = (char)i;
strList.Add(aa.ToString());//把A到Z放到列表中
number[i-48]=aa;


string resultStr = "";//你要的字符串
for (int i = 0; i < 20; i++)

Random random = new Random();
int index = random.Next(strList.Count);
resultStr = resultStr + strList[index];
strList.RemoveAt(index);


if (resultStr.IndexOfAny(number) == -1)//判断是否含有数字,没有则重新生成字符串

goto loop;//跳到上面


这样产生的字符串,字符不会有重复的。而且一定会有两字符和数字的。
我已经调试过了,你看看结果。
我运行的结果是:768543210ZYXWVUTSRQ9
参考技术A public string CreateCheckCode()

char[] CharArray = 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', '1', '2', '3', '4', '5', '6', '7', '8', '9';
string sCode = "";
Random random = new Random();
for (int i = 0; i < 20; i++)

sCode += CharArray[random.Next(CharArray.Length)];

return sCode;


补充:你定义一个集合(Collection),用于保存两次生成的sCode
参考技术B private int rep = 0;

private string GenerateCheckCode()

string str = string.Empty;
long num2 = DateTime.Now.Ticks + this.rep;
this.rep++;
Random random = new Random(((int)(((ulong)num2) & 0xffffffffL)) | ((int)(num2 >> this.rep)));
Random r = new Random(((int)(((ulong)num2) & 0xffffffffL)) | ((int)(num2 >> this.rep)));
int n = r.Next(6, 11);
for (int i = 0; i <n; i++)


char ch;
int num = random.Next();

if ((num % 2) == 0)

ch = (char)(0x30 + ((ushort)(num % 10)));

else

ch = (char)(0x41 + ((ushort)(num % 0x1a)));

str = str + ch.ToString();


return str;

生成5-10个字符之间的随机字符串。

以上是关于如何让C#产生不重复的随机数的主要内容,如果未能解决你的问题,请参考以下文章

C# 如何生成不重复的1-100随机数。

该如何让随机数不重复!!!我想不到了?

JAVA中怎么随机产生一个不重复的四位数

怎么用Java产生不重复的邀请码

C# Random.Next()产生不重复随机数

C语言如何产生不重复的随机数