IEnumerable 对一组集合的洗牌不是随机的

发布于 2024-11-05 06:12:44 字数 368 浏览 2 评论 0 原文

我正在使用上一个问题中的洗牌方法 -

需要 IEnumerable 上的扩展方法 但是当我使用这些方法中的任何一个通过

调用类似的方法来对 IEnumerable> 的每个元素进行洗牌时,

SetOfSets.Select(set => set.Shuffle());

所有元素都以相同的顺序进行洗牌。怎么让它随机呢?

I am using shuffling methods from my previous question-

An extension method on IEnumerable needed for shuffling

But when I am using any of these methods for shuffling each elements of an IEnumerable<IEnumerable<T>> by calling something like-

SetOfSets.Select(set => set.Shuffle());

all the elements are shuffled in same order. How to make it random?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

瘫痪情歌 2024-11-12 06:12:44

问题在于链接问题中的 Shuffle 扩展方法每次都会实例化一个新的 Random 对象。由于默认构造函数使用Environment.TickCount 来为随机数生成器提供种子,并且这一切发生得非常快,因此所有列表都获得相同的随机种子。

您需要实例化您自己的 Random 实例并将其传递给 Shuffle 重载:

public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng)

来自 这个答案

那么你的代码将是:

Random myRandom = new Random();
SetOfSets.Select(set => set.Shuffle(myRandom));

The problem is that the Shuffle extension method in the linked question instantiates a new Random object each time. Since the default constructor uses Environment.TickCount to seed the random number generator and this all happens very quickly, all the lists get the same random seed.

You need to instantiate a Random instance of your own and pass it to the Shuffle overload:

public static IEnumerable<T> Shuffle<T>(this IEnumerable<T> source, Random rng)

from this answer.

Your code, then, would be:

Random myRandom = new Random();
SetOfSets.Select(set => set.Shuffle(myRandom));
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文