5

1から36までの144の番号をランダムな順序で持つ配列を生成したいと思います(したがって、各番号は4回繰り返されます)。Enumerable.RepeatとEnumerable.Rangeを使用してそれを行うことはできますか?はいの場合、どのように私に説明してください?

4

4 に答える 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 に答える