Как сгенерировать случайное целое число в диапазоне

программа, которую я пишу, требует, чтобы я моделировал мутацию генов. Если определенный экземпляр (J) гена выбран для мутации, он должен случайным образом стать одним из предопределенного подмножества альтернативных генов. Эти дискретные гены отмечены целыми числами в диапазоне от 0 до K-1, где K равно общему количеству аллелей.

В общем, мне нужна помощь в написании кода для случайного выбора целого числа в диапазоне от 0 до K-1, которое не равно J. Любая помощь очень ценится!

ДРУГОЕ РЕДАКТИРОВАТЬ: Спасибо за всю помощь до сих пор, я придумал следующее, которое игнорирует требование, что я не могу равняться J. Однако еще одна проблема, с которой я столкнулся, заключается в том, что процесс должен повторяться несколько раз, и из-за того, что одно и то же семя используется каждый раз, когда значение i всегда одинаково. Как я должен обеспечить, чтобы начальное значение не оставалось одинаковым в каждом поколении? Опять же, любая помощь приветствуется!

program randtest

implicit none

  real*4        :: u(5)
  integer       :: i(5)
  integer       :: k = 4
  integer, dimension (1) :: seed = (/2817/)

  call random_seed(put=seed) 

  call random_number(u)

i = floor((k+1)*u) 

 print *, i

 end program randtest

person user3555793    schedule 01.05.2014    source источник
comment
Вы можете найти ответ здесь: stackoverflow.com/questions/23057213/   -  person Alexander Vogt    schedule 01.05.2014
comment
Следуя ссылке, замените [0,5] на [0,K-2] (при условии, что J находится в этом интервале).   -  person francescalus    schedule 01.05.2014


Ответы (1)


Действительно, можно использовать метод, указанный в ответах на другой вопрос, для набора {0, 1,... , К-1}. Сложность, которую J (0‹=J‹=K-1) можно решить, отбрасывая J при выборке.

Однако лучше всего отметить, что существует K-2 допустимых целых чисел: {0, 1,..., J-1, J+1,..., K-1}. Итак, используйте метод для генерации целого числа более {0, 1, ..., K-2} и просто сдвиньте вверх все, на что повлияет отклонение J.

call random_number(u)
i = FLOOR((K-1)*u)  !this would be how I would define the range
if (i.ge.J) i=i+1
person francescalus    schedule 01.05.2014
comment
Спасибо, до сих пор я придумал следующее. /2817/) call random_seed(put=seed) call random_number(u) i = floor((k+1)*u) print *, i конец программы randtest - person user3555793; 05.05.2014