0

これを何時間も検索しましたが、取得できません。Fisher-Yates とリストされている多くの方法を使用して値を返す方法がわからないようです。私はここで死にかけています。

RandomNumber を取得できますが、これは何度も再利用されます。返されるたびに一意である必要があります(または、可能だと思う傾向があります)。

何をすべきか、各部分がなぜ機能するのか、ダミーのことを理解するのに助けが必要です。これが機能します:

    private int RandomNumber(int min, int max)
    {
        Random random = new Random();
        return random.Next(min, max);
    }

そして、これが私が入れているもので、機能しています(ただし、一意の乱数は使用されていません)...見る必要があると感じたものと、それが配置されている場所のみを含めました:

  private void ComputersTurn()
    {
        Control.ControlCollection coll = this.Controls;
        foreach (Control c in coll)
        {
            if (...)
            {
                if (...)
                {

                    if (...)
                    {
                        if ((c.Name == "btn" + Convert.ToString(RandomNumber(1,9)) && (c.Enabled != false) )) 
                        {
                            if (...)
                            {
                                //code here
                            }
                        }


                    }
                }
            }
        }
    }

繰り返しますが、RandomNumber は機能しますが、一意ではありません。一意の番号を返す方法を知りたいです (可能であれば)。

4

4 に答える 4

1

順番を入れ替えて最小から最大までのすべての整数を返そうとしているだけですか? これは、各ランダムが一意であることが保証されるように、特定の範囲内のランダムな整数のシーケンスが必要な唯一の方法です...

私が正しいとすれば、配列をランダムに並べ替えるコードを簡単に見つけることができるはずです。

于 2013-02-21T06:38:58.927 に答える
0

Random クラスを 1 回だけインスタンス化します。

private Random random = new Random();

private int RandomNumber(int min, int max)
{
    var result = this.random.Next(min, max);
    return result;
}
于 2013-02-21T07:51:43.690 に答える
0

によって一意の番号を生成する唯一の方法Randomは、クラスで次のように定義することです。

public static class RandomGenerator
{
    private static readonly Random _random = new Random();

    public static int GenRand(int x, int y)
    {
        return _random.Next(x, y);
    }
}

あなたの場合、このコードを次のように使用してみてください。

private void ComputersTurn()
    {
        Control.ControlCollection coll = this.Controls;
        foreach (Control c in coll)
        {
            if (...)
            {
                if (...)
                {

                    if (...)
                    {
                        if ((c.Name == "btn" + Convert.ToString(RandomGenerator.GenRand(1, 9)) && (c.Enabled != false) )) 
                        {
                            if (...)
                            {
                                // code here
                            }
                        }


                    }
                }
            }
        }
    }
于 2013-02-21T06:37:38.933 に答える
-1

Random クラスのインスタンスの宣言を関数の外に置いて、乱数が重複しないことを確認したい場合は毎回異なる数を取得できるようにし、生成されたすべての数を格納するために List を使用できるようにします

class Classname
{
private Random random = new Random();
//your code
}
于 2013-02-21T06:43:08.977 に答える