私は偏りのある範囲内の数字を捨てることによって、常に偏りのない乱数を生成してきました。これに似ている
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 アプローチが最初のものほど安全ではない (偏りがない) 理由はありますか?