7

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

我怎样才能做到这一点?

4

4 回答 4

22
Random r = new Random();
foreach (int i in Enumerable.Range(0, 9).OrderBy(x => r.Next()))
{
    Console.WriteLine(i);
}
于 2012-11-19T16:28:19.940 回答
6
  1. 生成索引 0 到 8 的数组
  2. 随机排列数组
  3. 使用该位置的索引遍历数组
于 2012-11-19T16:22:57.090 回答
0

一种可能:

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

于 2012-11-19T16:29:38.367 回答
0

从网络搜索中找到了这个——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

于 2012-11-19T16:31:58.347 回答