我有一个长度为12的int数组[],我想随机填充0到3的数字,但我想确保正好有0,1,2和3中的三个在数组中。关于如何做到这一点的任何想法?
答案 0 :(得分:5)
非随机填充然后随意播放:
int[] myArray = new int(12);
for (i = 0; i < 12; ++i)
{
myArray[i] = i/3;
}
Random rnd = new Random();
for (i = 0; i < 12; ++i)
{
//int swapWith = rnd.Next(12);
// Corrected to avoid bias. See comments.
int swapWith = rnd.Next(i+1);
int temp = myArray[i];
myArray[i] = myArray[swapWith];
myArray[swapWith] = temp;
}
答案 1 :(得分:2)
你可以从有序数组(例如0,0,0,1,1,1 ......等)开始,然后像洗牌一样进行随机播放。浏览每个索引并将内容与另一个随机内容交换。
答案 2 :(得分:1)
这里的其他几个答案建议简单地交换随机选择的元素。这不会产生真正随机的结果。请参阅此处了解详细原因以及更好的随机排序方式:http://www.codinghorror.com/blog/2007/12/the-danger-of-naivete.html
答案 3 :(得分:0)
填充数组然后随机播放数字。如何做洗牌你可以在这里找到:Randomize a List<T>
答案 4 :(得分:0)
Random rnd=new Random();
var array = new[] {0, 1, 2, 3, 0, 1, 2, 3, 0, 1, 2, 3}
.OrderBy(i => rnd.Next() )
.ToArray();
答案 5 :(得分:0)
这还有一个方法......
var rnd = new Random();
var items = Enumerable.Repeat(Enumerable.Range(0, 4), 3).SelectMany(item => item).OrderBy(item => rnd.Next()).ToArray();