我想创建一个以随机顺序循环遍历数字0-8的for循环。请注意,每个号码只能访问一次。
我怎样才能做到这一点?
答案 0 :(得分:16)
Random r = new Random();
foreach (int i in Enumerable.Range(0, 9).OrderBy(x => r.Next()))
{
Console.WriteLine(i);
}
答案 1 :(得分:6)
答案 2 :(得分:1)
一种可能性:
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之间数字的列表。
然后在循环中,我们从列表中选择一个随机数,并在循环结束时将其从列表中删除,以便下一个循环不能再次选择。
答案 3 :(得分:0)
通过网络搜索发现这一点 - 在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
我找到的原件来自: