【问题标题】:Random Number Generator with no repeats [duplicate]没有重复的随机数生成器[重复]
【发布时间】:2021-06-18 13:36:21
【问题描述】:

我正在尝试研究如何制作一个随机数生成器,它输出 4 个从 0 到 9 的整数而没有任何重复。

需要一些帮助 我刚开始用 c# 编码,但找不到任何问题的答案

【问题讨论】:

  • RNG 没有重复 - 另一种说法是你想要一个 shuffle (然后从一开始就根据需要消耗尽可能多的项目)。找到这个词可能会更好。
  • 请张贴直接代码而不是图片
  • 随机 rand = new Random(); int[] randNumbers = Enumerable.Range(0, 10).Select(x => new { n = x, rand = rand.Next() }).OrderBy(x => x.rand).Select(x => xn).ToArray();
  • 这是用 c#、Console、Visual Studio 制作的

标签: c# random


【解决方案1】:

您需要从检查中删除int 是否已经重复。 所以:

if (val1 == val2)
{
    val2 = rnd.Next(1,11);
}

而不是:

if (val1 == val2)
{
    int val2 = rnd.Next(1,11);
}

后者将声明一个仅存在于“if”块范围内的新变量“val2”,而不是按照您的意图更新现有的“val2”变量。这称为“阴影”。

【讨论】:

  • 这种情况下其实是编译错误。
  • 删除此编译器错误不会产生实际工作的代码。
【解决方案2】:

对于“快速而肮脏”的解决方案,您可以使用LINQ。例如,这样的事情会随机选择 0 到 9 范围内的 4 个数字:

var random = new Random();
var numbers = Enumerable.Range(0, 10)
    .OrderBy(_ => random.Next())
    .Take(4)
    .ToList();

如果你需要更精确和更快的东西,那么你可以实现 Fisher–Yates shuffle 例如。

【讨论】:

  • 这偏向于范围较早的项目更有可能。
  • @Servy 你能解释一下吗?
  • OrderBy 是一种稳定的排序方式,因此如果发生冲突,集合中较早的项目将在结果中较早。
  • 显然,除了实际上分布不均匀之外,这种解决方案的效率也远低于实际的 shuffle 算法。
  • @Servy 感谢您提供的信息。我还要说偏见(尽管确实存在)应该很小。
猜你喜欢
  • 2021-06-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 1970-01-01
  • 2016-03-01
相关资源
最近更新 更多