【问题标题】:Why does "new Random().Next()" not return random numbers like "random.Next()"?为什么“new Random().Next()”不返回像“random.Next()”这样的随机数?
【发布时间】:2014-07-03 07:08:08
【问题描述】:

我尝试了两种不同的方法来获取随机数序列:

// (a) works
Random random = new Random();
return Enumerable.Range(0, 20).OrderBy(n => random.Next());

// (b) does not work
return Enumerable.Range(0, 20).OrderBy(n => new Random().Next());

我使用random.Next() 的第一个变体运行良好。

但是我调用new Random().Next() 的变体不返回随机数;而是返回一个从 0 到 20 的数字序列。

现在我的问题是:

  • 在 C# 中表示对象new Random().Next() 的第二种类型初始化的术语是什么?
  • 它与第一个有什么不同,以至于我没有得到期望的输出?

【问题讨论】:

  • 顺便说一句。 OrderBy 随机数的目的是什么?为什么不直接返回随机数呢?例如,要获取n 范围内[a..b) 的随机数序列,请执行Enumerable.Range(1, n).Select(_ => random.Next(a, b))
  • 大声笑...说真的,伙计!你在开玩笑,不是吗?获取 0 到 20 之间的随机数然后对它们进行排序有什么意义!!!它甚至有意义吗?
  • @stakx - 您的示例可能会产生重复,这与提供的示例不同。
  • @Leo 不会产生重复,因为来源只是Enumerable.Range(0,20)。你如何排序并不重要:它不包含重复项。
  • 只是要明确一点:在对序列进行洗牌时,您可能需要shuffle,而不是排序算法。

标签: c# random


【解决方案1】:

Random 类在构造时使用种子进行初始化 - 此种子将用于生成唯一的数字序列。如果未指定种子 - Environment.TickCount 用作种子。在您的情况下,序列的构建速度如此之快,以至于 Random 类在每个构建的实例中都获得相同的种子。所以所有项目都返回相同的值,而不是随机排序。

另一方面,第一条工作线对于每个可枚举项都有一个 Random 类实例。所以调用 .Next() 会产生下一个随机数,尽管种子是相同的,并且序列是随机排序的。

谈到生成没有重复的随机序列 - 查看Fisher-Yates shuffle。您的 Random() 示例具有副作用 - 执行每个循环迭代都会更改 Random() 类实例的内部状态,这可能导致不良行为 - 例如,如果排序算法依赖于每个序列项在排序期间返回相同数字的事实( .net 不是这种情况,但谁知道呢 - 内部实现将来可能会改变)。

【讨论】:

  • “您的 Random() 示例有副作用” - 有什么副作用? “可能导致不良行为” - 什么不良行为?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-10-21
  • 1970-01-01
相关资源
最近更新 更多