У меня есть одномерный массив целых чисел с ненулевым значением по некоторым индексам, остальные равны нулю. Ненулевое значение равно индексу. Например:
CHOOSEARRAY = (/0,0,0,4,0,6,7/)
Я хочу выбрать случайным образом любой ненулевой элемент из этого массива. В этом случае я хочу, чтобы на выходе было либо 4,6, либо 7.
Мой текущий подход немного запутан и работает следующим образом:
Подсчитайте количество доступных вариантов
NCHOICE = COUNT(CHOOSEARRAY.NE.0)
Создайте массив и заполните его ненулевыми значениями
ALLOCATE(CHOICES(NCHOICE))
CHOICES = PACK(CHOOSEARRAY,CHOOSEARRAY.NE.0)
Выберите случайный элемент из этого нового массива
CHOSENVAL = CHOICES(FLOOR(1+GRND()*NCHOICE))
Здесь GRND () - это функция генерации случайных чисел, которая выводит действительное число, равномерно распределенное между 0 и 1.
Этот кодовый блок должен повторяться несколько раз, что требует нескольких операций выделения и освобождения, что может занять много времени. Есть ли лучший способ решить эту проблему?
В качестве альтернативы, есть ли способ вернуть индекс случайно выбранного ненулевого элемента? Например, (/ 0,1,1,0,0,1 /) с равной вероятностью должно дать либо 2,3, либо 6.