【问题标题】:How to randomly generate 1000 sequences of 6 digit number如何随机生成1000个6位数字序列
【发布时间】:2017-03-10 12:09:19
【问题描述】:

我想随机生成 1000 个数字并将结果放入富文本框中,但我从代码中得到的结果只是富文本框中出现的一个数字!

 private Random _random = new Random();
 int min = 000000;
 int max = 999999;
 string s;  
 private void Form1_Load(object sender, EventArgs e)
 {
    for (int i = 0; i < 1000; i++)
    {
       s = _random.Next(min, max).ToString("D6") + "\n";
    }
    richTextBox1.Text = s;
 }

【问题讨论】:

  • @TimSchmelter 这是一个具有多行属性的富文本框
  • 只是为了确认:您对列表中出现重复数字感到满意,对吧?
  • 那么,它们是 0 - 999999 范围内的数字,如果数字少于六位,则在开头用 0 填充?

标签: c# .net winforms random


【解决方案1】:

每次获得下一个数字时,您都会覆盖 s 的值。相反,您必须将号码添加到列表中。这样的事情会奏效。

List<string> numbers = new List<string>();

private void Form1_Load(object sender, EventArgs e)
{
    for (int i = 0; i < 1000; i++)
    {
        numbers.Add(_random.Next(min, max).ToString("D6"));
    }
    richTextBox1.Text = string.Join(Environment.NewLine, numbers);
}

【讨论】:

  • 不客气。如果它有效,如果您接受我的回答,我将不胜感激:)
【解决方案2】:

由于这里使用 .net 类的大多数答案 Random 我不会使用它,因为在直接比较中它不会创建 strong 随机数。

示例:

因此,如果您想要 strong 随机数,则应避免使用 Random 并使用命名空间 System.Security 中的 RNGCryptoServiceProvider .密码学

示例代码:

private RNGCryptoServiceProvider _random = new RNGCryptoServiceProvider ();
int min = 000000;
int max = 999999;
private void Form1_Load(object sender, EventArgs e)
{
    int[] results = new int[1000];
    var buffer = new byte[4];
    int min = 100000;
    int max = 999999;
    for (int i = 0; i < results.Length; i++) {
        while(results[i] < min || results[i] > max)
        {
            _random.GetBytes(buffer);
            results[i] = BitConverter.ToInt32(buffer, 0);
        }
        richTextBox1.Text += results[i].toString();
    }
}

【讨论】:

  • 你是如何生成点图像的?
  • @ryanwebjackson 我已经有一段时间没有这样做了,但我为每个点生成了两个值,然后将它们绘制在画布上。我不再知道我生成了多少点 (> 10000),但我知道我只将值限制为 >= 0
【解决方案3】:

您实际上需要将结果与先前计算的结果连接起来,现在它正在每次循环执行时替换s 中的字符串值,并且您最终只得到s 中的最后一个值,快速修复是使用+ 使用污染:

for (int i = 0; i < 1000; i++)
{
  s+= _random.Next(min, max).ToString("D6") + "\n"; // now it keeps previous values as well
}

【讨论】:

    【解决方案4】:

    问题是您实际上在每次迭代时都会覆盖字符串 s。您需要将号码附加到旧号码。

    for (int i = 0; i < 1000; i++)
    {
        s += _random.Next(min, max).ToString("D6") + "\n";
    }
    richTextBox1.Text = s;
    

    你也可以使用AppendText方法

    for (int i = 0; i < 1000; i++)
    {
        richTextBox1.AppendText(_random.Next(min, max).ToString("D6") + "\n");
    }
    

    Matthew Watson 的建议:当生成如此大的字符串时,建议使用StringBuilder。 Is 比普通的字符串连接性能要好得多:

    StringBuilder sb = new StringBuilder(8000);
    
    for (int i = 0; i < 1000; i++)
    {
        sb.AppendLine(_random.Next(min, max).ToString("D6"));
    }
    
    richTextBox1.Text = sb.ToString();
    

    【讨论】:

    • 我强烈建议您使用StringBuilder 来创建字符串。
    • @MatthewWatson 聪明的主意!谢谢你。写答案时太不耐烦了;)想透彻
    【解决方案5】:
    s += _random.Next(min, max).ToString("D6") + "\n";
      ^
      |
      ---- You're missing this plus sign
    

    【讨论】:

      【解决方案6】:

      在这行代码中,您覆盖了richTextBox1Text

      for (int i = 0; i < 1000; i++)
          {
             s = _random.Next(min, max).ToString("D6") + "\n";
          }
          richTextBox1.Text = s;
      

      只需将其更改为(在s 之后添加+

      for (int i = 0; i < 1000; i++)
          {
             s += _random.Next(min, max).ToString("D6") + "\n";
          }
          richTextBox1.Text = s;
      

      【讨论】:

      • 那不行。它只会显示最后生成的数字
      【解决方案7】:

      请注意,maxValue 或 Random.Next 是独占的,因此永远不会生成 999999。

      var numbers = Enumerable.Repeat(new Random(), 1000)
                              .Select(r => r.Next(1000000).ToString("D6")); // the same new Random() instance is used for all .Next
      
      richTextBox1.Text = string.Join("\r\n", numbers);
      

      或者更高效一点:

      richTextBox1.Text = Enumerable.Repeat(new Random(), 1000).Aggregate(new StringBuilder(7000)
                      , (b, r) => b.AppendFormat("{0:D6}\n", r.Next(1000000))).ToString(0, 6999);
      

      【讨论】:

        【解决方案8】:

        只需为richtextbox1 添加“+”,如下所示

        试试这个

        private void Form1_Load(object sender, EventArgs e)
              {
                  for (int i = 0; i < 1000; i++)
                {
                    s = _random.Next(min, max).ToString("D6") + "\n";
        
                     richTextBox1.Text + = s;
                }
        
            }
        

        【讨论】:

        • 不,那行不通。它只会显示最后生成的数字
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-29
        • 2018-12-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多