我使用该方法生成唯一编号,但我总是得到相同的编号-2147483648。即使我停止程序,重新编译它并再次运行我仍然看到相同的数字。
public static int GetRandomInt(int length)
{
var min = Math.Pow(10, length - 1);
var max = Math.Pow(10, length) - 1;
var random = new Random();
return random.Next((int)min, (int)max);
}
答案 0 :(得分:7)
尝试外化随机实例:
private readonly Random _random = new Random();
public static int GetRandomInt(int length)
{
var min = Math.Pow(10, length - 1);
var max = Math.Pow(10, length) - 1;
return _random.Next((int)min, (int)max);
}
答案 1 :(得分:3)
这不是不重复使用Random实例的问题,他得到的结果应该是多次启动的随机,而不是总是 - (2 ^ 32)
这是长度过大的问题,并且将长度的强制转换为int。如果您将代码分成以下几行:
var min = Math.Pow(10, length - 1);
var max = Math.Pow(10, length) - 1;
var random = new Random();
var a = (int)min;
var b = (int)max;
return random.Next(a, b);
你会看到a和b是-2147483648,这是Next(min, max)
唯一可能的结果(doc指定min == max,return min)。
使用此方法可以安全使用的最大长度为9.对于长度为10,您将获得System.ArgumentOutOfRangeException
,长度为> 10你将得到-2147483648的结果。
答案 2 :(得分:2)
你应该保留一个Random实例而不是new()它的实例,这样可以给你更好的结果。
同时检查实际长度。它可能会给你带来有趣的结果。
答案 3 :(得分:2)
您的代码有三个问题。
第一个问题是因为在重新初始化随机变量时,您可能没有足够的时间推进种子。第二个错误来自将你的(非常大的)数字截断为整数。最后,你最大的问题是你的最小和最大之间的范围。考虑使用输入1-> 20:
查找最小值和最大值之间的范围(在代码中定义)length max-min
1 8
2 89
3 899
4 8999
5 89999
6 899999
7 8999999
8 89999999
9 899999999
10 8,999,999,999
11 89999999999
12 899999999999
13 8999999999999
14 89999999999999
15 899999999999999
16 9E+15
17 9E+16
18 9E+17
19 9E+18
请记住,最大整数是2,147,483,647,它会在任何大于9的数字上传递。
答案 4 :(得分:1)
这篇文章已被讨论了数百次。 FAQ from stackoverflow on this
答案 5 :(得分:1)
我认为问题在于min
和max
的计算。它们会比Int32.MaxValue
快得多......
答案 6 :(得分:0)
在你的班级中,有一个Random实例,例如:
public class MyClass
{
private readonly Random random = new Random();
public static int GetRandomInt(int length)
{
var min = Math.Pow(10, length - 1);
var max = Math.Pow(10, length) - 1;
return random.Next((int)min, (int)max);
}
}
随机始终返回相同值的事实仅用于测试目的。
答案 7 :(得分:0)
随机类通常使用种子来初始化自己,并且通常会返回相同的序列,前提是种子是相同的:
编写真正的随机数生成器非常困难。大多数方法使用外部熵发生器(例如鼠标移动,cpu温度,甚至复杂的物理机制,如氦气球相互碰撞......)。
答案 8 :(得分:0)
Random
实例只应创建一次,然后重复使用。这样做的原因是RNG默认为当前系统时间播种。如果您快速创建新的Random实例(并从中拉出一个值),那么其中许多将以相同的时间戳播种,因为循环可能比系统时钟前进的速度更快。
请记住,由种子A初始化的RNG将始终返回序列B.因此,如果您创建了三个Random
个实例,所有实例都以123
为种子,则这三个实例将始终返回相同的数字。同样的迭代。