Создать случайное число, которое больше определенного числа

В 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.

Другие вопросы по тегам