对于程序的一部分,我需要以下两种方法。
列出的第一个方法将生成一个随机数。 其中第二种方法将“调用”此方法来填充数组。
阵列有最大值100上未定义的元素数量(所有随机生成的数字应在1-100之间)。
问题是我从来没有得到随机数。 (要么得到100 x相同的值,3个随机数除以数组的100个最大元素,要么重复100次相同的值)。
问题应该在第一种方法中,但我似乎无法弄清楚问题。 一直在盯着这一段时间......
问题应该是返回,因为它会创建随机生成的数字。但是我如何每次都返回生成的值? (必须使用3个参数调用int方法。)
private int ValidNumber(int[] T, int X, int Range)
{
for (byte I = 0; I < T.Lenght; I++)
{
Random RndInt = new Random();
X = RndInt.Next(1, Range+1);
}
return X;
}/*ValidNumber*/
public void FillArray(int[] T, int Range)
{
for (byte I = 0; I < T.Length; I++)
{
T[I] = ValidNumber(T, I, Range);
}
}/*FillArray*/
控制台代码:
public void ExecuteProgram()
{
ClsBereken Ber = new ClsBereken();
//const byte Range = 100;
const int Max = 100;
int[] T = new int[Max];
Ber.FillArray(T, Max);
DisplayArray(T);
}/*ExecuteProgram*/
private void DisplayArray(int[] T)
{
for (byte i = 0; i < T.Length; i++)
{
Console.Write("{0,4} ", T[i]);
}
Console.WriteLine();
}/*DisplayArray*/
任何帮助都很受欢迎。 亲切的问候。
答案 0 :(得分:4)
重新使用Random
实例。 注意我对此进行了编辑,以显示传递Random
实例,但我真的不确定ValidNumber
正在尝试做什么 - 看起来喜欢它是不是燃烧了CPU周期?我建议您完全删除ValidNumber
(并使用Random
中FillArray
中的下一个值),但可能是您尝试在此处执行某事 - 我只是不确定是什么!
private int ValidNumber(int[] T, int X, int Range, Random random)
{
for (byte I = 0; I < T.Lenght; I++)
{
X = random.Next(1, Range+1);
}
return X;
}/*ValidNumber*/
public void FillArray(int[] T, int Range)
{
Random random = new Random();
for (byte I = 0; I < T.Length; I++)
{
T[I] = ValidNumber(T, I, Range, random);
}
}/*FillArray*/
当你创建一个Random
时,它是使用系统时钟“播种”的,但这是大量的。如果你在一个紧凑的循环中创建了很多Random
,它们都会得到相同的“种子”,所以它们都会创建相同的下一个数字。
如果有必要,您可以将Random
进一步移出(如果您有其他循环),或者将其设为static
(但如果您这样做,则还需要担心同步)。
答案 1 :(得分:1)
问题是你一遍又一遍地重新初始化rndint。
走线:
Random RndInt = new Random();
并将其移到循环前面,看看是否能修复它。
初始化随机对象时,会为其分配一个种子(可能基于时间),并且该种子用于生成一系列看似随机的值。但是,如果将相同的种子插入到两个随机对象中,您将获得相同的随机数序列。
所以,你的代码中发生的事情是你用一个种子初始化一个新的随机对象,然后在它的系列中询问第一个随机数。然后,您正在初始化另一个随机对象(即使它被指定为相同的名称,它是一个新对象)并且它获得相同的种子,并且您再次要求系列中的第一个随机数。很自然地,你一遍又一遍地得到相同的随机数。
答案 2 :(得分:0)
您正在不断创建新的Random对象。我担心这是通过创作的时间戳播种(随机)。由于这非常快并且多次发生,因此种子是相同的,调用RndInt.Next(1, Range+1);
的结果也是如此。
顺便说一下,即使不是不正确,c#.net中的常见做法也不是以局部变量和参数名称的大写字母开头。
答案 3 :(得分:0)
任何随机数生成算法*都不是真正的随机;它只是一种确定性算法,专门设计用于输出类似随机性的数字。 (参见Pseudorandom number generator。)由于算法是确定性的,因此其输出完全取决于起始的“种子”值。
.NET中的Random
类有两个构造函数:一个接受整数种子,另一个不接受任何参数。这个种子的基础是当前时间。
根据这些信息,您可以猜测为什么为数组中的每个值创建一个新的Random
实例会导致整个数组都填充相同的数字:每次构造一个Random
对象< strong>在非常小的时间范围内,它将具有相同的种子值,这意味着它将生成与在同一时间范围内构建的另一个Random
对象相同的输出。
正如Marc Gravell已经指出的那样,你应该只使用一个Random
实例来生成一系列随机数。
*嗯,几乎任何。我相信随机数生成器的硬件实现会考虑随机噪声(取自周围环境),因此可能被认为是“真正”随机的。您是否认为这些 实际上是随机的 取决于你对“随机”的个人定义,以及你是否认为我们生活在确定性的宇宙中。
答案 4 :(得分:0)
您可以传递Random()一个种子,但如果您发送相同的种子编号,您将获得相同的结果。您使用它的方式
Random rnd = new Random();
根据时间使用自动生成的种子。但如果你至少不睡一秒钟,你可能不会得到看似随意的结果。 (来源http://msdn.microsoft.com/en-us/library/system.random(VS.71).aspx)
正如大家在这里已经提到的那样,你最大的问题是你每次迭代都会不断重建随机对象。