C# 中的随机数生成器问题

本文关键字:问题 随机数生成器 | 更新日期: 2023-09-27 18:35:26

很长一段时间后,我设法从我在第一个问题中询问的程序中得到了结果。它将随机数添加到要用作 ID 号的列表,然后将其导出到 Excel。但是,当我在数据文件中使用 2 个以上的数据成员时,我遇到了一个问题:我生成的随机数翻倍,导致我的程序崩溃。

static Dictionary<string,Backup> getData()
{
    Dictionary<string, Backup> bDict = new Dictionary<string, Backup>();
    StreamReader reader = new StreamReader("/data/storedata.txt");
    while (!reader.EndOfStream)
    {
        string line = reader.ReadLine();
        string[] parts = line.Split(' ');
        string item = parts[0];
        string owner = parts[1];
        Random rnd = new Random();
        int test = rnd.Next(item.Length+10000);//For every 'item' a Random number is generated.(the +10000 is simply to produce a 4-digit number)
        //Console.WriteLine(test);//Testing 
        Backup BP = new Backup(item, owner,test);
        bDict.Add(test.ToString(), BP);//Adding to the Dictionary.
        //Console.WriteLine(string.Format("{0}, {1}, {2}", item, test, owner));
    }
    return bDict;
}//Read file, Grabed data and stored it in a List.

我所追求/试图做的是进行某种检查,如果两个数字相同,则会生成一个新数字作为替换(或其他做同样事情的方法)。我已经尝试了if语句,但VS一直在问我是否打算与其他东西进行比较。我已经在 Stackoverflow 上查看了内容,但答案与我的代码不符。任何帮助不胜感激。

常见问题数据文件将有超过 500 个"项目"无最小值/最大值

干杯

C# 中的随机数生成器问题

我生成的随机数加倍,导致我的程序崩溃。

您必须重用相同的随机实例,因此请在循环外创建它,否则它将同时播种,导致相同的数字。

MSDN:

随机数生成从种子值开始。如果相同 种子被重复使用,产生相同的数字系列。

除此之外,您必须检查Dictionary中是否已存在该数字:

Random rnd = new Random();
while (!reader.EndOfStream)
// ...
while(bDict.ContainsKey(test.ToString()))
    test = rnd.Next(item.Length + 10000);

首先,您需要将Random对象初始化移到while循环之外

Random rnd = new Random();
while (!reader.EndOfStream)....

http://msdn.microsoft.com/en-us/library/system.random.aspx

随机数生成从种子值开始。如果重复使用相同的种子,则会生成相同的数字序列。生成不同序列的一种方法是使种子值与时间相关,从而使用每个新的 Random 实例生成不同的序列。默认情况下,Random 类的无参数构造函数使用系统时钟生成其种子值

这基本上是意思:启动它太快(即,在某种loop中),你可能会得到相同的值。

在 while 循环之外实例化rnd。然后,您将为随机数提供正确行为的机会。您正在做的是导致生成器重新初始化;破坏生成器的统计属性。

但是,对于您的特定问题,我根本不会使用rnd原因是您不想要任何重复的随机数。绘制一个随机数,然后测试它是否已经被绘制是低效的,并且随着时间的推移变得越来越低效(顺便说一下,也会破坏生成器的统计属性:虽然预期均值将保持正确,但预期方差将增加到 1/12 以上,更高的时刻将不正确)。

如果你真的不需要你的序列是特别随机的(即不在乎平均值的期望值是0.5等),那么你可以开发一个函数,以明确定义的方式交换整数中的各种位。使用该函数的输出,该函数将连续的数字作为序列。