Создать случайное число, которое больше определенного числа
В Advanced Bash-Scripting Guide Chaper 9.3. $ RANDOM: генерировать случайное целое число
Это иллюстрирует, как генерировать случайное число больше определенного числа:
FLOOR=200
number=0 #initialize
while [ "$number" -le $FLOOR ]
do
number=$RANDOM
done
echo "Random number greater than $FLOOR --- $number"
echo
И тогда комментарий говорит:
# Let's examine a simple alternative to the above loop, namely
# let "number = $RANDOM + $FLOOR"
# That would eliminate the while-loop and run faster.
# But, there might be a problem with that. What is it?
Я думаю, что это все еще случайность и больше, чем $FLOOR
так что я не знаю в чем проблема.
3 ответа
Проблема, вероятно, происходит из-за переполнения. Допустим, ваш prng генерирует число от 0 до maxint. Если вы просто добавите слово, что произойдет, когда сложение даст число, большее, чем maxint? Конечно, вы можете просто отклонить эти цифры, но это приведет к тому же алгоритму, который вы предложили.
В зависимости от пола, некоторые приемы могут быть использованы для минимизации отклонения. Например, если необходимое число больше, чем maxint / 2, вы можете систематически устанавливать старший бит перед тестированием на отклонение.
$RANDOM
никогда не будет иметь результат больше, чем 32767. Однако, если вы ожидаете результат между $FLOOR
и 32767, добавив $FLOOR
а также $RANDOM
не поможет тебе Если вы рассматриваете любое значение больше 32767 как 32767, то вы делаете свой генератор более предсказуемым. Не так плохо, моддинг вашего результата (32767 - $FLOOR)
и добавление $FLOOR
, Другое решение без зацикливания заключается в использовании $RANDOM * ( 32767 - $FLOOR ) / 32767 + $FLOOR
но bash не хватает математики с плавающей запятой и может пропустить пару чисел из-за ошибки округления.
Проблема в том, что вы можете сгенерировать 0, и тогда ваше число будет равно FLOOR.