for循环中的随机迭代

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

我怎样才能做到这一点?

 Random r = new Random(); foreach (int i in Enumerable.Range(0, 9).OrderBy(x => r.Next())) { Console.WriteLine(i); } 
  1. 生成索引0到8的数组
  2. 洗牌arrays
  3. 使用该位置的索引迭代数组

一种可能性:

 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之间数字的列表。然后在循环中,我们从列表中选择一个随机数,并在循环结束时从列表中删除它,以便下一个周期不能再次选择。

通过网络搜索发现了这一点 – 在Perl中实现的Fisher-Yates shuffle。

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

 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