43093


C#で配列に格納された0から9までの数字を重複せずにランダムに取り出して別の配列に格納したいのですが、何か方法はありますか？


CC BY-SA 3.0
2018-04-09T09:12:58.097
43091
2018-04-10T00:26:27.793
28044
question
c#
C#で乱数を重複せずに取り出す方法について

[code]

    int[] ary = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
    
    System.Random rng = new System.Random();
    int n = ary.Length;
    while (n > 1)
    {
        n--;
        int k = rng.Next(n + 1);
        int tmp = ary[k];
        ary[k] = ary[n];
        ary[n] = tmp;
    }
    
[/code]


CC BY-SA 3.0
2018-04-09T09:13:36.293
43092
2018-04-09T09:22:45.447
2018-04-09T09:22:45.447
19110
28021
43091
answer


Linqを使った2Liner版です。  
手軽にランダムな配列を作成することができます。  
ただしソート用の`random.Next()`に同値が入った場合にはソート前の配列順に並ぶため、完全にランダムな並び替えにはなりません。  
例えば`src`の0が1より前に配置される確率は約0.0000000000000002%高くなります。  
[Random.NextDoubleの備考を参照](https://msdn.microsoft.com/ja-
jp/library/system.random.nextdouble%28v=vs.110%29.aspx?f=255&MSPPError=-2147217396)  
この特性を踏まえて、ほぼランダムな配列を作成したい時のみご利用ください。

[code]

    using System;
    using System.Linq;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                var src = new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
                //ランダムな別の配列作成
                var random = new Random();
                var dest = src.OrderBy(x => random.NextDouble()).ToArray();
                //結果表示
                Console.WriteLine(string.Join(", ", dest));
                Console.ReadLine();
            }
        }
    }
    
[/code]


CC BY-SA 3.0
2018-04-09T09:31:35.540
43093
2018-04-10T00:26:27.793
2018-04-10T00:26:27.793
9820
9820
43091
answer