C# - 如何重复获取相同的随机数

4

可能是重复问题:
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” 不会得到好的结果,因为 quantity 是整数。请尝试使用“100 * a / quantity”。 - Ben Voigt
2
啊,好老的 new Random() :) 重复了... - Marc Gravell
1
今晚大家都很活跃!在不到6分钟内就有2条评论和3个回答 - 我印象深刻! - mmuller
2个回答

3

backgroundWorker1_DoWork 中的循环非常快,导致在 generateCode 中生成的 Random 对象总是使用相同的种子值,从而产生相同的值。不要重新创建 Random 对象,而是在类的构造函数中分配一个实例变量,并仅使用该变量。


2

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

Random rnd = new Random();

使用当前时间来初始化LFSR,当程序运行速度很快时,同样的“当前时间”会连续使用多次。

好的,那我该如何在每次迭代中获得一个新的随机数? - mmuller
就像Femaref所说的那样,创建一个Random对象并将其保存在可以重复使用的地方。 - Ben Voigt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接