0

これが乱数を生成するためのコードですが、重複した数字が表示されます。どうすればこれを克服できますか。

    void getnumbers()

    {
        Random r = new Random();
        int[] trubyte = new int[4];
        for (var x = 0; x < 4; ++x)
        {
            trubyte[x] = r.Next(1, 5);
        }
        b1.Content = trubyte[0];
        b2.Content = trubyte[1];
        b3.Content = trubyte[2];
        b4.Content = trubyte[3];
    }
4

5 に答える 5

2

メソッドが既に持っている乱数を返す場合は、別の乱数を取得するだけです。

void getnumbers()
{
    Random r = new Random();
    int num;
    var trubyte = new List<int>();

    for (var x = 0; x < 4; ++x)
    {
        do
        {
            num = r.Next(1, 5);
        } while(trubyte.Contains(num));

        trubyte[x] = num;   
    }
    b1.Content = trubyte[0];
    b2.Content = trubyte[1];
    b3.Content = trubyte[2];
    b4.Content = trubyte[3];
}

List配列の代わりに使用しているのはContains、他の特別な理由ではなく、すぐにメソッドを提供するからです。

ランダムで繰り返されない数値の大きなリストを生成する場合(最悪の場合はO(n ^ 2))、これは効率的ではありませんが、4つの数値の場合は十分です;)

于 2012-12-10T21:57:06.173 に答える
0

出力がランダムであるため、乱数ジェネレーター関数は重複を返す可能性があります。

RNGを使用して一意である必要のある番号を生成する場合は、それらを使用する前に、それらがまだ生成されていないことを確認する必要があります。

Windows Mobileでこの[0]のようなものを使用することはできませんか?独自のRNGを作成するよりも実用的なようです。

0: http: //msdn.microsoft.com/en-us/library/system.security.cryptography.randomnumbergenerator (v=vs.90).aspx

于 2012-12-10T11:41:03.283 に答える
0

自分で行う必要があります。つまり、番号がすでに生成されているかどうかを確認する必要があります。

于 2012-12-10T11:41:35.613 に答える
0

gjulianmが言ったようにそれを行うことができますが、それは数の長いリストであり、たとえば1000は多くの時間を無駄にするでしょう。したがって、1000のランダム化されたリストが必要な場合は、次のように進めることができます。

  • サイズ1000の配列trubyteを、trubyte [0] = 1、trubyte [1]=2などで初期化します。
  • 変数arraysize=1000を初期化します
  • ループを1000回実行し、最初に乱数k btw 0-(arraysize-1)を抽出します。乱数はa[k]であり、リストで個別に指定できます。次に、trubyte[k]をtrubyte[arraysize]と交換します。そして最後に、アレイサイズを1つ減らします。

別の方法として、ループ中に番号が必要ない場合は、ループの実行後に変更されたリストを使用するだけです。

void getnumbers(){
Random r = new Random();
int num;
int[] trubyte = new int[1000];
int finalList[] =  new int[1000]
for (int x = 0; x < 1000; ++x)
{
 trubyte[x]=x+1;
}
int arraysize=1000;
for (var x = 0; x < 1000; ++x)
{
    int k=r.Next(0, arraysize);
    finalList[x]=trubyte[k];
    trubyte[k]=trubyte[arraysize-1];
    arraysize--;
}
//use the finalList

}

于 2012-12-11T11:33:14.727 に答える
0

Windows Phoneアプリケーションでは、ハッシュセットの代わりに辞書を使用できます。以下は、個別の乱数を生成するためのコードです。

    static int[] GetRandomNumbersNonrepeat(int noOfRandomNumbers, int maxValue)



    {
        Dictionary<int, int> randomnumbers = new Dictionary<int, int>();
        while (randomnumbers.Count < maxValue)
        {
            Random r = new Random();
            int rnum = r.Next(1, maxValue+1);

            if (!randomnumbers.ContainsValue(rnum))
            {

                randomnumbers.Add(randomnumbers.Count + 1, rnum);
            }

        }



        int[] rnums = randomnumbers.Values.ToArray<int>();
        return rnums;
    }
于 2012-12-12T09:52:43.550 に答える