【问题标题】:Looping through a method call too fast? [duplicate]循环调用方法太快? [复制]
【发布时间】:2016-01-25 03:06:16
【问题描述】:

我正在调用一个名为 buy 的方法实例。我的方法随机生成一串数字和数字。对于更改字符串的方法,我的 for 循环似乎要快,因为在获得新字符串之前,我连续 2-3 次获得相同的字符串。当我添加一个 System.Threading.Thread.Sleep(100);我得到的随机数就像它应该的那样。问题是它太慢了,我觉得必须有更好的方法。有没有办法在不调用 Sleep() 方法的情况下每次获取随机字符串?

for (int i = 0; i < exit; i++)
{
    ticket = buy.SetNum();
    Console.WriteLine("Wellcome Mr.Nissan. The winning numbers for Lotto max are:");
    Console.WriteLine(ticket);
    System.Threading.Thread.Sleep(25);
}

【问题讨论】:

  • buy.SetNum() 是做什么的?
  • 如果看不到 buy.SetNum() 中发生了什么,就不可能知道问题出在哪里,因为您发布的代码本身并没有任何变化。
  • 你是如何生成随机数的?如果您每次都创建Random 类的新实例,您将得到此行为,因为默认种子是当前时间,如果您快速调用它,则不会有所不同。
  • 另外,变量(或字段?)ticket 是否设置在代码中的其他任何位置?

标签: c# for-loop random


【解决方案1】:

是的,这是您的随机数生成器的问题 - 不是您在问题中发布的代码。

考虑以下几点:

public int GenRandomNum()
{
   var r = new Random();
   return r.Next()
}

如果您在同一滴答中调用它,您将基于相同的种子生成一个新的随机类,它将生成相同的数字。将随机初始化移出方法将解决问题,如下所示:

private Random _rand = new Random();
public int GenRandomNum()
{
   return _rand .Next()
}

【讨论】:

  • 对此进行扩展:通常,您应该尽可能少地拥有Random 实例。 (每次执行程序一个,或者每个线程一个,其中这些是从全局种子中播种的,以避免重复种子。)
  • 非常感谢您的救命稻草!
  • 谢谢帮了我很多忙!
【解决方案2】:

您尚未包含实际创建随机数的代码,但我怀疑您每次循环时都会创建随机数生成器的新实例。

您需要做的是创建随机数生成器的一个实例(在循环之外)并将其重用于每个随机数生成器 .Next() 调用。

【讨论】:

  • 用代码示例打败你 ;)
【解决方案3】:

将随机数生成移入循环:

var rnd = new Random(); 

for (int i = 0; i < exit; i++)
{
    var ticket = rnd.Next();
    Console.WriteLine("Wellcome Mr.Nissan. The winning numbers for Lotto max are:");
    Console.WriteLine(ticket);
}

如果没有看到 buy.SetNum(); 方法代码,我无法告诉您为什么您发布的代码无法正常工作。

【讨论】:

    猜你喜欢
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-05
    相关资源
    最近更新 更多