输出错误。我的随机数在哪里?

时间:2013-10-14 13:11:03

标签: c# listview for-loop random

我是编程的新手,我正在读一本关于C#的书。这段代码没有输出我期望的内容。

以下是代码:

public partial class Form1 : Form
{
    static string stars = "****************************************************************";
    const int MAXVAL = 52;
    const int MAXELEMENTS = 100;

    int[] data = new int[MAXELEMENTS];

    public Form1()
    {
        InitializeComponent();
    }

    private void button1_Click(object sender, EventArgs e)
    {
        int i;
        Random rd = new Random(5);
        int j;
        string buff;

        for (i = 0; i < data.Length; i++)
        {
            data[i] = rd.Next(MAXVAL);
            buff = " ";
            for (j = 0; j < data[i]; j++)
            {
                buff += "*";
                lstResult.Items.Add(data[i].ToString() + " " + buff);
            }
        }
    }
}

这是输出: enter image description here

为什么列表视图中的随机顺序中没有随机数?

5 个答案:

答案 0 :(得分:1)

取出Random()之后的5,即种子值。只需使用默认构造函数:

种子 - 用于设置生成一系列随机数的起点的整数。种子将发生器设置为随机起始点。唯一种子返回唯一的随机数序列。

因为你每次都使用5作为种子,所以你得到重复的数字

   Random rd = new Random();

答案 1 :(得分:1)

您总是使用相同的数字5为随机实例播种。这会导致重复数字。您只需使用默认构造函数:

Random rd = new Random();

查看MSDN上显示此行为的示例。

顺便说一下,这也是一个常见的陷阱,你应该总是重用相同的随机实例,而不是总是创建一个新的(在循环中),因为种子是从当前时间创建的。如果你以非常快的速度创建random,你将得到相同的种子,这会导致重复的数字。

答案 2 :(得分:0)

每次使用此行Random rd = new Random(5);

时,您使用相同的种子(5)

使用默认构造函数生成随机数:

Random rd = new Random();

答案 3 :(得分:0)

如果您在Random.Next循环之外进行j调用,并且Items.Add内有Items.Add,则输出是合乎逻辑的。

我建议将j调用移到 {{1}}循环后面。

答案 4 :(得分:0)

声明没有种子的随机类。

 Random rd = new Random();