0

私は c# を使用して datagridview に乱数を入力しようとしていますが、何らかの理由ですべてのセルで同じ値を取得し続けています。

    public int GenerateRandomNumber()
    {
        const int minimumNumber = -9;
        const int maximumNumber = 15;
        var random = new Random();
        var randomNumber = random.Next(minimumNumber, maximumNumber);
        return randomNumber;
    }

gameBoard はデータグリッド ビューです。

    private void populateButton_Click(object sender, EventArgs e)
    {
        CreateGameBoard((int)columnsNumericUpDown.Value,(int)rowsNumericUpDown.Value);
        gameBoard.RowTemplate.Height = gameBoard.Height/gameBoard.RowCount;
        foreach (DataGridViewRow row in gameBoard.Rows)
        {
            foreach (DataGridViewCell cell in row.Cells)
            {

                cell.Value = GenerateRandomNumber();
            }
        }
    }
4

2 に答える 2

5

乱数発生器を再作成しない:

// Random generator, one instance for the loop, no re-creation 
private m_Random = new Random();
...
public int GenerateRandomNumber()
{
    const int minimumNumber = -9;
    const int maximumNumber = 15;

    // Do not re-create random generator! Use single instance instead
    //var random = new Random();
    var randomNumber = m_Random.Next(minimumNumber, maximumNumber);
    return randomNumber;
}
于 2013-09-02T06:09:34.197 に答える
4

ランダムはクロックを使用して初期化されます。つまり、同じ値が複数回取得されます。

したがって、Random インスタンスを再作成する代わりに、単一の Random インスタンスを保持し、同じインスタンスで Next を使用し続ける必要があります。複数のスレッドがある場合は、解決策をロックするためにこれを読む必要があります

これが必要です。

private Random random = new Random();
const int minimumNumber = -9;
const int maximumNumber = 15;
public int GenerateRandomNumber()
{        
    var randomNumber = random.Next(minimumNumber, maximumNumber);
    return randomNumber;
}
于 2013-09-02T06:11:47.957 に答える