-1

さまざまな選択肢の確率を含む配列があります。例えば:

配列 1 には {5, 3, 2, 7, 1} の値があります。選択肢「0」は 5/18 の確率で選ばれ、選択肢「1」は 3/18 の確率で選ばれます。「18」は、配列の値の合計です。

これが私のコードです(この場合、8つの選択肢があります):

int i = rand() % sumofvaluesofarray; //edited from array_size
int c = 0;
int sum = 0;
while(c < 8){
    sum += array[c];
    if(i < sum){
        choice = c;
        break;
    }
    c += 1;
}

これはすべて動作しないプログラムの一部ですが、問題はコードのこの部分にあると思われます。何か問題がありますか?とにかく、このコードをより効率的に書く方法はありますか?

4

3 に答える 3

3

質問者はコードを変更し続けます。今後の質問者への注意: コンパイル中のコードを正確に投稿してください。

いくつかの問題があるようです。18まず、配列のサイズではなく、までの乱数を作成する必要があります。

int i = rand() % 18;

これは、必ずしも均一な分布に従っているとは限らないことに注意してください ( 18 の倍数のi場合のみ)。RAND_MAX

さらに、c8 までループしていますが、代わりに 5 である必要があります。

while(c < 5){

そうしないと、 の境界外にアクセスしていますarray

次の行には、FULLWIDTH SEMICOLON Unicode 文字 (U+FF1B) もあります。

sum += array[c];
//             ^

ドキュメントからコピーしたのでしょうか。通常のセミコロン文字 (U+003B) であることを確認してください。

C++11 コンパイラを使用している場合は、これを効率的に記述する方法を気にするのをやめて、<random>ヘッダーだけを利用できます。

std::random_device rd;
std::mt19937 gen(rd());
std::discrete_distribution<> d(std::begin(array), std::end(array));

これにより、 を呼び出すことで、離散分布に従ってランダムな値を生成できますd(gen)

于 2013-04-14T23:10:09.807 に答える
2
int i = rand() % size_array;
int c = 0;
int sum = 0;
while(c < 8){
    sum += array[c];    // Missing semicolon
    if(i < sum){
    choice = c;
    break;
    }
    c += 1;
}

そこにセミコロンがありません。

于 2013-04-14T23:08:19.157 に答える
0

コード内のアルゴリズムが正しく機能しているかどうかを知りたい場合は、それを関数に記述し、単体テストを作成します。このようにして、期待される結果と比較できる事前定義されたパラメーターのセットを関数に供給することができます。これで、デバッグ セッションに入るときに、関数が適切に動作し、コードの他の領域に集中できるという合理的な仮定の下で行うことができます。

于 2013-04-14T23:57:23.260 に答える