0

私はツイストメソッドに次のことをさせようとしています:

数値(結果)を保存する
乱数を生成し、それを結果に追加し
ますこれまでのコードは次のとおりです。

public int twist(int min, int max)
{
    int result = 0;
    Random random = new Random();

    int y = random.Next(min, max);

    result += y;

    System.Diagnostics.Debug.WriteLine(result);
    return result;
}

保存していないため、毎回新しい数値を生成するだけです。ループは必要ないと思いますが、y をインクリメントするたびに結果を格納する必要があり、y はツイストのたびにインクリメントする必要があります。メソッドが呼び出されます。

4

5 に答える 5

3

メソッドの外に「結果」を格納します。また、乱数発生器を静的にする傾向があり、呼び出しごとに生成する数を記憶する傾向があります。

Marc Gravell が述べているように、「new Random() を実行するたびに、クロックを使用して初期化されるため、Random を静的に保つのが最善です。これは、タイトなループでは同じ値が何度も取得されることを意味します。単一の Random を保持する必要があります。インスタンスを作成し、同じインスタンスで Next を使用し続けてください。」

詳細と引用元については、乱数を 1 つだけ生成する乱数ジェネレーターを参照してください。

private int _result = 0;
private static Random _rand = new Random();

public int twist(int min, int max)
{
    int y = _rand.Next(min, max);

    _result += y;

    System.Diagnostics.Debug.WriteLine(_result);
    return _result;
}
于 2012-04-16T23:05:21.683 に答える
2

試す:

private int result;
private Random random = new Random();

public int twist(int min, int max)
{
    int y = random.Next(min, max);
    result += y;

    System.Diagnostics.Debug.WriteLine(result);
    return result;
}

result同じメソッドを複数回呼び出してアクセスする必要があるため、変数ではなくフィールドにする必要があります。お使いのバージョンでは、 を個別に呼び出すたびtwistに新しい変数が作成され、それが 0 に設定されます。それをフィールドに抽出すると、オブジェクトの作成時に 0 に初期化され、毎回twistリセットせずに を呼び出すたびに増分されます。

于 2012-04-16T22:46:58.807 に答える
1
private static int result = 0;
private static Random random = new Random();

public int twist(int min, int max)
{
    int y = random.Next(min, max);
    result += y;

    System.Diagnostics.Debug.WriteLine(result);
    return result;
}

result基本的に、メソッドが作成されて毎回ゼロに設定されないように、メソッドの外部で宣言する必要があります。

注:.aspx.csファイルで作業している場合は、それをstatic(またはSession変数)として宣言する必要がある場合があります。そうしないと、Webページで発生するすべてのアクションでリセットされます。

注2:各インスタンスはシステムクロックに依存するため、ランダムは静的です。したがって、インスタンスが1つだけあり、そのインスタンスを呼び出し.Next(min, max)て別の乱数を取得します。

于 2012-04-17T13:57:03.907 に答える
1

を反復する限り、任意の数の乱数の合計を返すきちんとした小さなメソッドを次に示しIEnumerableます。

public IEnumerable<int> Twist(int min, int max)  {
  Random random = new Random();
  int result = 0;
  while (true) {
    result += random.Next(min, max);  // overflow pretty likely for large max
    System.Diagnostics.Debug.WriteLine(result);
    yield return result;
  }
}

// For a single element
int oneResult = Twist(1, 5).First();

// For the fifth
int fifth = Twist(1, 5).Skip(4).First();

そして、イテレーションを延期したい場合は、自分で素敵な拡張メソッドを定義してください。

public static class EnumeratorExt {
    public static T Next<T> (this IEnumerator<T> seq) {
        if (seq.MoveNext()) {
            return seq.Current;
        }
        return default(T);
    }
}

// Now call it like so!
using (var generator = Twist(5, 10).GetEnumerator()) {
    Console.WriteLine(generator.Next());
    Console.WriteLine(generator.Next());
    Console.WriteLine(generator.Next());
    Console.WriteLine(generator.Next());
}
于 2012-04-16T22:54:08.083 に答える
0

「保存する」の意味によって異なります。どこに並べる?グローバル?ファイル?データベース?その場合、グローバルを意味していると思いますが、ツイストメソッドのスコープ外で結果変数を宣言します

于 2012-04-16T22:49:10.297 に答える