数组2方法随机生成的数字

时间:2010-03-06 18:23:54

标签: c#

对于程序的一部分,我需要以下两种方法。

列出的第一个方法将生成一个随机数。 其中第二种方法将“调用”此方法来填充数组。

阵列有最大值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*/

任何帮助都很受欢迎。 亲切的问候。

5 个答案:

答案 0 :(得分:4)

重新使用Random实例。 注意我对此进行了编辑,以显示传递Random实例,但我真的不确定ValidNumber正在尝试做什么 - 看起来喜欢它是不是燃烧了CPU周期?我建议您完全删除ValidNumber(并使用RandomFillArray中的下一个值),但可能是您尝试在此处执行某事 - 我只是不确定是什么!

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

正如大家在这里已经提到的那样,你最大的问题是你每次迭代都会不断重建随机对象。