LINQ で重複なしのランダムサンプリング[A]を行うもっとも単純な方法は,おそらくランダムに並び替えて先頭から所望の数だけ要素を取り出す方法でしょう。 var random = new Random(); source.OrderBy(_ => random.NextDouble()).Take(n); 重み付きでサンプリングしたい場合は乱数に重みを与えて大きい順に取り出します。 source.Zip(weight, (x, w) => new { Value = x, Weight = w }) .OrderByDescending(x => { var u = random.NextDouble(); return Math.Pow(u, 1.0 / x.Weight); }) .Take(n) .Select(x => x.Value); しかしこの方法では全体をソートするので,デ