Как получить массив случайно упорядоченных чисел от 1 до N? - PullRequest
2 голосов
/ 23 марта 2012

Код ниже генерирует массив N целых случайных чисел и сохраняет результат в random_int_array

 N=20
 allocate(array(N/2))
 call random_seed
 call random_number(array)
 random_int_array=int(array*N)

Проблема в том, что я могу генерировать дубликаты в random_int_array, а я нетхочу это.Как я могу удалить дубликаты из этого массива или, что то же самое, как я могу сгенерировать набор уникальных случайных чисел?

Обратите внимание, что array имеет измерение N / 2.Таким образом, проблема состоит в том, чтобы извлечь N / 2 чисел, без дубликатов, из N.

Ответы [ 3 ]

3 голосов
/ 23 марта 2012

Похоже, вы хотите, чтобы целые числа от 1 до 19 в случайном порядке. Это было бы перемешать эти целые числа. См., Например, http://tekpool.wordpress.com/2006/10/06/shuffling-shuffle-a-deck-of-cards-knuth-shuffle/ или http://en.wikipedia.org/wiki/Fisher-Yates_shuffle

0 голосов
/ 28 июня 2014

Определите следующую функцию вне вашей основной программы

function random_uniform(m)
  implicit none
  integer*8 m
  real*8 random_uniform
  m = mod(7**5*m, 2147483647)
  random_uniform = m / 2147483647.     
end function

Затем внутри главной функции используйте эту функцию для генерации случайного массива:

m = 1067 !This is your seed which you can change to get different sequence
do i = 1,20
   array(i) = random_uniform(m)
enddo

Обратите внимание, что все целые числа имеюттип двойной точности (* 8).Это необходимо для правильной работы этой функции.Также, чтобы избежать целочисленного деления для получения random_uniform, мы преобразовали знаменатель в вещественное (из целого числа * 8)

0 голосов
/ 23 марта 2012

Итак, вы пытаетесь сгенерировать одну из возможных комбинаций размера 10 из набора размера 20?Есть 184756 таких комбинаций.Вы можете сгенерировать одно случайное целое число в диапазоне [1..184756] и использовать его в качестве входных данных для функции для создания n-й комбинации.

Эта последняя проблема регулярно поднимается на SO, например Рассчитать комбинацию на основе позиции содержит решение.

Я не утверждаю, что этот подход лучше в любом случае, чем многократное генерирование случайных чисел в нужном диапазоне и выбрасывание дубликатов до тех пор, пока вы не получитенабор, который удовлетворяет вашим требованиям.

...