質問

ダブル、フロート、短い、長いランダムな値を生成する機能がいくつかあります。データ型を渡す別の関数があり、ランダムな値を返す必要があります。次に、その関数で、渡されたデータ型に基づいて戻り値を選択する必要があります。たとえば、フロートを通過した場合、必要です:

リターンがフロートであるという確率は70%であり、リターンが2倍、短い、または長いという確率はそれぞれ10%です。対応するランダム値を生成するために他の関数を呼び出すことができますが、最終的なリターンのために確率的な重みに適合するにはどうすればよいですか?私のコードはC ++です。

いくつかのポインターが高く評価されています。

ありがとう。

役に立ちましたか?

解決

C ++乱数はあります 均一な分布. 。必要に応じて ランダム変数 別の 分布 数学的な式の均一な分布に基づいている必要があります。

ランダム変数の数学的式がない場合は、次のことを行うことができます。

int x = rand() % 10;
if (x < 7)
{
 // return float
}
else (if x == 7)
{
 // return double
}
else (if x == 8)
{
 // return short
}
else (if x == 9)
{
 // return long
}

他のヒント

これは、99.999%または0.0001%などの正確な値の確率を得るために確率(実際の割合)を取得する可能性を得ることができる将来の参照の代替として役立ちます。

//70%
double probability = 0.7;
double result = rand() / RAND_MAX;
if(result < probability)
   //do something

この方法を使用して、非常に大きな浸透したグリッドを作成しましたが、精密値の魅力のように機能します。

あなたが何をしたいのかを正しく理解しているかどうかはわかりませんが、確率が70-10-10-10であることを保証したい場合は、次のことを行います。

  • 乱数を生成します r (1,2,3,4,5,6,7,8,9,10)
  • もしも r <= 7: : 浮く
  • もしも r == 8: : 短い
  • もしも r == 9: :ダブル
  • もしも r == 10: : 長さ

パターンを認識し、任意の確率値に適応できると思います。

Mmonemには素晴らしい確率的スイッチがありますが、異なるタイプを返すことも些細なことではありません。 (目的のために)適切に値をエンコードできる単一のタイプが必要です - boost :: any、boost :: variant、union、または最も有能なタイプ(おそらく二重)に変換するか、文字列表現を変換してください。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top