【问题标题】:Generate a random number if the number matched with the previous如果数字与前一个匹配,则生成一个随机数
【发布时间】:2014-03-05 12:24:21
【问题描述】:

我想创建一个前面带有文本的随机数,并且我不希望系统显示一个数字两次。所以,这就是我的做法:

Random _rand = new Random();

private void RandomNumberGenerator()
        {
            int random = _rand.Next(10000);
            string text = "TP0" + random;

            if (random.Equals(random))
            {
                _rand.Next();
            }

            else
            {
                random = _rand.Next(10000);
            }

            MessageBox.Show(text);
        }

我没有得到任何显示的数字两次(但我不太确定,因为我只是关闭程序直到它显示数字 5 次(所有数字都不是同一个数字)。

是否有可能从上面的代码中显示一个数字两次?

谢谢。

【问题讨论】:

  • random.Equals(random) 不会总是返回true?你为什么用它?
  • 生成一个从0到10000的序列然后使用Fisher–Yates shuffle

标签: c# random


【解决方案1】:

经过编辑以消除幻数并确保理智。

  Random _rand = new Random();
  HashSet<int> _taken = new HashSet<int>();
  object _syncRoot = new object();

  private int RandomNumberGenerator() {
    lock (_syncRoot) {
      const int MAX_NUMBER = 10000;
      if (_taken.Count == MAX_NUMBER) {
        throw new Exception("All possible numbers are already generated.");
      }

      int random = _rand.Next(MAX_NUMBER);
      while (_taken.Contains(random)) {
        random = (random + 1) % MAX_NUMBER;
      }
      _taken.Add(random);
      return random;
    }
  }

【讨论】:

  • 如果(random + 1) % 10000 之前生成了 2 个调用怎么办?单个_oldNumber 是不够的。
  • @L.B - 虽然我的目标不是让两个具有相同值的数字序列;更新以确保序列中所有数字的唯一性
  • @OndrejSvejdar:什么是HashSet、锁和对象?无论如何,谢谢你的回答:D
  • @Kaoru 如果你想从多个线程中使用这个随机数生成器,锁和对象可以确保原子性。见msdn.microsoft.com//library/c5kehkcz.aspx
  • 第 10001 次调用 RandomNumberGenerator 会发生什么?
【解决方案2】:

Soner Gonul 是正确的,我认为 random.Equals(random) 总是正确的。 您可以(大致)通过使用另一个 int 变量来解决它存储在您的第二个变量中,这是前一个随机数。这是一种方法,如果你不明白,我可以试着在一分钟内把它定义得更清楚一点

【讨论】:

  • Welp,@OndrejSvejdar 写了一个更好的实际示例来说明我想说的:p
猜你喜欢
  • 2013-05-20
  • 2014-12-27
  • 2018-04-21
  • 2023-01-03
  • 2011-09-18
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多