我想以随机顺序生成一个从 1->36 有 144 个数字的数组(因此每个数字重复 4 次)。我们可以使用 Enumerable.Repeat 和 Enumerable.Range 来做到这一点。如果是,请向我解释如何?
问问题
1865 次
4 回答
10
好吧,创建包含所有数字的序列很容易:
var items = from x in Enumerable.Range(1, 36)
from y in Enumerable.Repeat(x, 4)
select y;
然后你可以使用ToArray
它进入一个数组并随机播放它。在 SO 上使用 C# 对数组进行洗牌有很多问题,例如这个. 您可以直接使用该代码,也可以直接调用ToArray
数组并将其打乱,最后不产生它。
于 2010-01-07T11:36:44.677 回答
0
int[] numbers = Enumerable.Range(0, 144).Select(i => (i % 36)+1).OrderBy(g => Guid.NewGuid()).ToArray();
于 2010-01-07T11:37:36.063 回答
0
// Generate the list (not in random order)
var one_to_36 = Enumerable.Range(1, 36);
var lst = one_to_36.Concat(one_to_36).Concat(one_to_36).Concat(one_to_36).ToList();
// Randomize the list by swapping random elements
Random rnd = new Random();
for(int i = 0; i < lst.Count; i++)
{
int i1 = rnd.Next(lst.Count);
int i2 = rnd.Next(lst.Count);
int tmp = lst[i1];
lst[i1] = lst[i2];
lst[i2] = tmp;
}
于 2010-01-07T11:39:33.720 回答
0
var seq = Enumerable.Range(0, 144);
var all = seq.ToList();
var random = new Random();
var result = seq.Select(i => {
var index = random.Next()%all.Count;
var r = all[index] % 36 + 1; all.RemoveAt(index);
return r;
}).ToList();
于 2010-01-07T16:33:02.163 回答