2011-07-26 7 views
0

ユーザーは数字を10個のテキストボックスに入力し、それらを配列に送りました。今私はこの配列から乱数を生成したいと思います。私に何ができる?cで数字を与えることから乱数を生成する#

+1

アレイから乱数を選択しますか?または乱数ジェネレータの「シード」として配列を使用しますか? –

+0

私は種を入れたいです。 – MAB

+0

それから私の答えを見てください(問題を解決すればそれを受け入れてください)。 –

答えて

3

何か:

public class Randomizer<T> 
{ 
    private readonly Random _random = new Random(); 
    private readonly IList<T> _numbers; 
    public Randomizer(IList<T> numbers) 
    { 
     _numbers = numbers; 
    } 

    public T Next() 
    { 
     int idx = _random.Next(0, _numbers.Count); 
     return _numbers[idx]; 
    } 
} 

使用法:

var r = new Randomizer<int>(new int[] { 10, 20, 30, 40, 50 }); 
for (int i = 0; i < 100; i++) 
    Console.Write(r.Next() + " "); 

それともshuffle the arrayにしたいですか?

[編集]

配列をシャッフルするには、this postに示すFisher–Yates shuffleを使用することができます。

// https://stackoverflow.com/questions/108819/110570#110570 
public class Shuffler 
{ 
    private Random rnd = new Random(); 
    public void Shuffle<T>(IList<T> array) 
    { 
     int n = array.Count; 
     while (n > 1) 
     { 
      int k = rnd.Next(n); 
      n--; 
      T temp = array[n]; 
      array[n] = array[k]; 
      array[k] = temp; 
     } 
    } 
} 

あなたは、インターフェイスが上記Randomizerクラスと同じようにしたい場合は、することができますクラスを使用するように変更してください。

public class Randomizer<T> 
{ 
    private readonly Shuffler _shuffler = new Shuffler(); 
    private readonly IList<T> _numbers; 
    public Randomizer(IList<T> numbers) 
    { 
     _numbers = new List<T>(numbers); 
     _shuffler.Shuffle(_numbers); 
    } 

    volatile int idx = 0; 
    public T Next() 
    { 
     if (idx >= _numbers.Count) 
     { 
      _shuffler.Shuffle(_numbers); 
      idx = 0; 
     } 

     return _numbers[idx++]; 
    } 
} 

コードはで、スレッドセーフではないであるため、Nextメソッドを複数のスレッドから同時に呼び出すことができる場合は、いくつかのロックを実装する必要があります。

+0

ok、それは動作しますが、私は、randomizerが繰り返さないために配列から生成するnumberをキックしたいと思います。 – MAB

+0

@ActuallyMAB:あなたは配列をシャッフルすることについて話しています([SOの答えへのリンクは私の記事の最後です](http://stackoverflow.com/questions/108819/best-way-to-randomize-a- string-array-in-c))。すべての配列番号がなくなったときに何が起こるべきかを明確にすることができますか?再編して再開すべきか?または例外をスローしますか? – Groo

+0

私は実際には数字を繰り返さないことを望みます。たとえば、結果は次のようになります。5-9-5-12。 – MAB

1

Seed標準System.Randomクラスからの値を持つクラス?すべての配列項目に依存する乱数が必要な場合は、それらをすべてXORします。このような

public static Random BuildSeededRandom(int[] data) 
{ 
    if (data == null || data.Length < 1) 
     return new Random(); 

    int xor = 0; 
    foreach (var i in data) 
     xor ^= i; 

    return new Random(xor); 
} 
関連する問題