【问题标题】:c# - getting the same random number repeatedly [duplicate]c# - 重复获取相同的随机数[重复]
【发布时间】:2010-12-18 19:05:38
【问题描述】:

可能重复:
Random number generator not working the way I had planned (C#)

嗨,

下面是我正在编写的一个小应用程序的完整代码 - 它返回一个字母数字代码的 ArrayList。我遇到的问题是,当“单步执行”代码时,e.Result 会正确返回,每个项目都不同。但是,如果我让应用程序在没有断点的情况下运行,我只会得到同一个变量的多个实例:

    public partial class AlphaNum : Form
{
    public AlphaNum()
    {
        InitializeComponent();

        // Initialise BackGroundWorker Reporting
        backgroundWorker1.WorkerReportsProgress = true;

        // Initialise BackGroundWorker Cancel
        backgroundWorker1.WorkerSupportsCancellation = true;

    }

    private void button1_Click(object sender, EventArgs e)
    {
        backgroundWorker1.RunWorkerAsync();
        button1.Enabled = false;
    }


    private int RandomNumber(int min, int max)
    {
        Random random = new Random();
        return random.Next(min, max);
    }

    public string RandomString(Random r, int len)
    {
        string str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890";
        StringBuilder sb = new StringBuilder();
        while ((len--) > 0)
            sb.Append(str[(int)(r.NextDouble() * str.Length)]);
        return sb.ToString();
    }

    private string generateCode()
    {
        Random rnd = new Random();
        int length = int.Parse(stringLength.Text);
        string code = "";
        code = RandomString(rnd, length);
        return code;
    }

    private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
    {
        int quantity = int.Parse(quantityRequired.Text);
        ArrayList codes = new ArrayList();
        string myText = "";

        for (int a = 0; a < quantity; a++)
        {

            myText = generateCode();
            codes.Add(myText);
            backgroundWorker1.ReportProgress(((100 / quantity) * a));

        }

        e.Result = codes;
    }

    private void backgroundWorker1_ProgressChanged(object sender, ProgressChangedEventArgs e)
    {
        progressBar1.Value = e.ProgressPercentage; //update progress bar
        //Console.WriteLine(time);
        //in this example, we log that optional additional info to textbox
    }

    private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
    {
        button1.Enabled = true;
        ArrayList codes = new ArrayList();
        codes = (ArrayList)e.Result;

        for (int i = 0; i < codes.Count; i++  )
        {
            outputText.Text += codes[i].ToString();
            outputText.AppendText(Environment.NewLine);
        }

    }


}

}

任何人都可以解释为什么当我通过逐步执行有效地减慢进程时结果是好的,但在没有停止/减慢的情况下运行时结果不正确?

非常感谢

【问题讨论】:

  • (100 / quantity) * a 不会给出好的结果,因为数量是一个整数。请改用100 * a / quantity
  • 啊,不错,新的 Random() :) 重复...
  • 今晚每个人都还活着!在不到 6 分钟的时间内 2 cmets 和 3 个答案 - 我印象深刻!

标签: c# random


【解决方案1】:

backgroundWorker1_DoWork 中的循环是如此之快,以至于在generateCode 中生成的Random 对象总是以相同的值作为种子,从而产生相同的值。不要重新创建 Random 对象,而是将一个分配给类的构造函数中的实例变量,并且只使用那个。

【讨论】:

    【解决方案2】:

    您不应该在每次需要随机数时都创建一个新的 Random 对象。

    Random rnd = new Random();
    

    使用当前时间初始化LFSR,当程序全速运行时,同一个“当前时间”会连续多次使用。

    【讨论】:

    • 好的,那我怎样才能在每次迭代中获得一个新的随机数呢?
    • 就像 Femaref 说的,只创建一个 Random 对象并将其保存在可以重复使用的地方。
    猜你喜欢
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 2013-01-18
    • 2012-01-16
    • 1970-01-01
    • 2013-01-31
    • 2011-06-12
    • 2019-05-21
    相关资源
    最近更新 更多