【问题标题】:Random Number Generator issue in C#C#中的随机数生成器问题
【发布时间】:2013-10-21 20:31:09
【问题描述】:

很久之后,我设法从我在第一个问题中询问的程序中得到了结果。它将随机数添加到列表中以用作 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 个“项目” 没有最小值/最大值

干杯

【问题讨论】:

  • 我很难相信你在 SO 上找不到另一个例子,这个问题太频繁了,几乎可以成为常见问题解答。在“提问”区域输入您的问题标题会在 SO 上产生很多可能的答案。
  • 我猜在这种情况下会出现恐慌。考虑到所有 io 操作(尤其是未注释的情况),循环中的语句很难快速运行。这将导致随机数发生一些变化。如果循环更紧密,那么 OP 会更清楚。
  • 随机数不是唯一的。使用 GUID。

标签: c# random numbers


【解决方案1】:

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

您必须重复使用相同的随机实例,因此在循环之外创建它,否则它会在同一时间播种,从而导致相同的数字。

MSDN

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

除此之外,您还必须检查Dictionary中是否已经存在该号码:

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

while(bDict.ContainsKey(test.ToString()))
    test = rnd.Next(item.Length + 10000);

【讨论】:

  • 这是唯一一个也解决了他将遇到的 NEXT 问题的答案。
  • 确实,+1,虽然 OP 会遇到最后一个问题:为什么算法会越来越慢,然后最终停止?
  • 感谢您的帮助,我应该知道的简单事情。这部分会有很大帮助。
【解决方案2】:

首先,您需要将Random 对象初始化移出while 循环。

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

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

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

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

【讨论】:

    【解决方案3】:

    在 while 循环之外实例化 rnd。然后你会给随机数机会正确表现。您正在做的是导致生成器重新初始化;破坏生成器的统计特性。

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

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

    【讨论】:

      猜你喜欢
      • 2017-04-10
      • 1970-01-01
      • 1970-01-01
      • 2016-05-26
      • 2018-01-03
      • 1970-01-01
      • 1970-01-01
      • 2011-05-18
      • 1970-01-01
      相关资源
      最近更新 更多