2

私は偏りのある範囲内の数字を捨てることによって、常に偏りのない乱数を生成してきました。これに似ている

int biasCount = MAX_INT % max
int maxSafeNumber = MAX_INT - biasCount;
int generatedNumber = 0;

do 
{
   generatedNumber = GenerateNumber();

} while (generatedNumber > maxSafeNumber)

return generatedNumber % max;

今日、友人が、生成された数値を浮動小数点数に変換し、それを最大値に対して乗算することで、乱数を生成する方法を教えてくれました。

float percent = generatedNumber / (float)MAX_INT; 
return (int)(percent * max);

これは、そもそもモジュラスを使用する必要がないため、バイアスの問題を解決しているようです。また、シンプルで高速に見えます。float アプローチが最初のものほど安全ではない (偏りがない) 理由はありますか?

4

2 に答える 2