【问题标题】:Random iteration in for loopfor循环中的随机迭代
【发布时间】:2012-11-07 14:49:45
【问题描述】:

我想创建一个 for 循环,以随机顺序遍历数字 0-8。请注意,每个号码只能访问一次。

我怎样才能做到这一点?

【问题讨论】:

  • This SO question 就是你要找的东西
  • 我尝试制作一个 0-8 整数列表,然后随机取一个,然后将其删除。但是在我的程序中,我使用了一种递归方法,这种解决方案并不实用
  • @BrunoCarvalhal 也许您应该发布一个示例,说明您是如何设计递归的,因为这似乎是您的问题/答案的重要元素。
  • @des,该问题讨论的是随机序列(有重复),而不是随机排列
  • @DanBryant 它生成1-100 的随机数列表,没有重复。

标签: c# random for-loop


【解决方案1】:
Random r = new Random();
foreach (int i in Enumerable.Range(0, 9).OrderBy(x => r.Next()))
{
    Console.WriteLine(i);
}

【讨论】:

  • 我要输入的内容也类似于此处链接的内容stackoverflow.com/a/254861/659190
  • 完美!正是我想要的。我太专注于一个 for 循环,而我应该使用这个 foreach 循环。
  • 很好的答案。如果它可以帮助像我这样的其他菜鸟,IEnumerable.OrderBy 是 System.Linq 命名空间中的扩展方法。
【解决方案2】:
  1. 生成索引为 0 到 8 的数组
  2. 随机排列数组
  3. 使用该位置的索引遍历数组

【讨论】:

  • 你到底为什么把 8 个拿出来?
  • 可能只是误读,认为它是一个长度为 8 的数组/列表,所以你只需要元素索引 07
  • 如果您不解释如何随机播放内容,此答案将无济于事。
  • 我不同意 - 数组洗牌很容易实现,这就是我建议的方法。 (+1 尽管有错字)
  • @KevinKalitowski:洗牌有很多方法,洗牌不是问题的主题。关键是将索引列表的生成与对索引的迭代分开。
【解决方案3】:

从网络搜索中找到这个 - Fisher-Yates shuffle,在 Perl 中实现。

这将生成任何输入数组的无偏随机化。

sub fisher_yates_shuffle {
    my $array = shift;
    my $i;
    for ($i = @$array; --$i; ) {
        my $j = int rand ($i+1);
        next if $i == $j;
        @$array[$i,$j] = @$array[$j,$i];
    }
}

更多信息:

http://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle

我找到的原件来自:

http://perl.livejournal.com/101830.html

【讨论】:

  • 算法多于代码。不能代表 C# 中 Random() 函数的公正性质,而 Fisher-Yates 绝对是。
【解决方案4】:

一种可能性:

var numbers = Enumerable.Range(0, 9).ToList();
var rnd =  new Random();
for (; numbers.Count != 0; )
{
    var currentNumber = numbers[rnd.Next(0, numbers.Count)];

    Console.WriteLine(currentNumber);

    numbers.Remove(currentNumber); // remove current random number from list
}

Enumerable.Range(0, 9).ToList() 创建一个包含从 0 到 8 的数字的列表。 然后在循环中我们从列表中选择一个随机数,并在循环结束时将其从列表中删除,这样下一个循环就不能再次选择它了。

【讨论】:

    猜你喜欢
    • 2020-08-05
    • 2021-12-27
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    • 2021-05-03
    • 1970-01-01
    • 1970-01-01
    • 2017-04-20
    相关资源
    最近更新 更多