Генерация случайного числа, которое больше определенного числа - PullRequest
3 голосов
/ 07 апреля 2011

In Расширенное руководство по написанию сценариев Bash 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, поэтому я не знаю, в чем проблема.

Ответы [ 2 ]

1 голос
/ 07 апреля 2011

Возможно, проблема в переполнении.Допустим, ваш prng сгенерирует число от 0 до maxint.Если вы просто добавите слово, что произойдет, когда сложение даст число, большее, чем maxint?Конечно, вы можете просто отклонить эти цифры, но это приведет к тому же алгоритму, который вы предложили.

В зависимости от пола, некоторые приемы могут быть использованы для минимизации брака.Например, если необходимое число больше, чем maxint / 2, вы можете систематически устанавливать старший бит перед тестированием на отклонение.

0 голосов
/ 07 апреля 2011

$RANDOM никогда не будет иметь результат, превышающий 32767. Однако, если вы ожидаете результат между $FLOOR и 32767, добавление $FLOOR и $RANDOM вам не поможет. Если вы рассматриваете любое значение больше 32767 как 32767, то вы делаете свой генератор более предсказуемым. Не так плохо, если вы модифицируете свой результат на (32767 - $FLOOR) и добавляете $FLOOR. Другое решение без зацикливания - использовать $RANDOM * ( 32767 - $FLOOR ) / 32767 + $FLOOR, но bash не хватает математики с плавающей запятой и может пропустить пару чисел из-за ошибки округления.

...