我是编程的新手,我正在读一本关于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);
}
}
}
}
这是输出:
为什么列表视图中的随机顺序中没有随机数?
答案 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);
使用默认构造函数生成随机数:
Random rd = new Random();
答案 3 :(得分:0)
如果您在Random.Next
循环之外进行j
调用,并且Items.Add
内有Items.Add
,则输出是合乎逻辑的。
我建议将j
调用移到 {{1}}循环后面。
答案 4 :(得分:0)
声明没有种子的随机类。
Random rd = new Random();