1

この質問は特定の面接や課題のためのものではなく、Quora に表示されたが誰も答えなかった質問です。75% の確率で true を返す関数 (実際にはどの言語でも) をどのように実装しますか? 統計は私の強みではなく、私にとってはそうする方法ですが、間違っていると思っています

void retTrue(){
    srand(time(NULL));
    if( (rand() % 4) == 0 ) return true;
    else return false;
} 
4

5 に答える 5

3

関数の潜在的な問題の 1 つを次に示します。 とrand()の間のランダムな整数を返します。実際の保証はありませんが、RNG はこの間隔で一様な分布を生成するように設計されています。ただし、次のようにモジュロ演算子を使用すると、0RAND_MAX

(rand() % 4) == 0

乱数の下位 2 ビットのみを見ています。問題は、一部の乱数ジェネレーターでは、下位ビットのランダム性が非常に弱い可能性があることです。25% の確率で発生する系列に依存しないランダム イベントを取得するより安全な方法は、次のとおりです。

((double) rand() / (double) RAND_MAX) < 0.25

rand()区間全体にわたる要素としてのランダム[0,RAND_MAX]性は、個々のビットのランダム性よりも信頼性が高くなります。

于 2013-10-11T00:54:03.257 に答える
0

関数内で srand を呼び出したくありません。time() の分解能は 1 秒です。その関数を 1 秒以内に 100 回呼び出した場合、毎回同じ結果が得られます。

Second rand は通常、非常に優れた乱数ジェネレーターではありません。完全な 75% の比率を得ることはまずありません。

3 番目の戻り値の型は void であり、コンパイラ エラー以外は何も返されません。

どうですか:

bool retTrue(){
static unsigned int n = 0;
n++;
return n % 4 != 0;
}

ランダムである必要があるという言及はありませんでした。

于 2013-10-10T20:39:05.610 に答える
0

Random Number GeneratorJavaを使用して数値を生成するだけではどうですか。これは、等しい確率で数値を生成する場合、True75% の時間を出力する必要があると思います。rand()これが間違っている場合は修正してください

疑似コード

 int generateNumber()
  {
     Random r = new Random();
     int seed = r.nextInt(100);
     if(seed < 25){
     return false;
     }else
     {
     return true;
     }        
  }
于 2013-10-10T20:43:46.597 に答える