bonjour à tous!
Je sollicite votre aide pour un petit problème que je n'arrive pas à résoudre.
Je suis en train de créer un programme en fortran 95, sur un domaine d'astrophysique. Pour faire simple, j'ai un tableau de N particules, référencés par l'indice du tableau, et je souhaite en sélectionner M, de manière totalement aléatoire, et non redondante. Qui plus est, il faut une méthode, efficace, rapide.
Pour l'instant voici ce que je fait :
_______________________Aléatoi re vraiment aléatoire____________
Code:ubroutine init_random_seed() integer :: i, n, clock integer, dimension(:), allocatable :: seed call random_seed(size = n) allocate(seed(n)) call system_clock(count=clock) seed = clock + 37 * (/ (i - 1, i = 1, n) /) call random_seed(PUT = seed) deallocate(seed) end subroutine
_____________________puis dans ma routine de calcul_____________
et par la suite, je retire les redondanceCode:do j=1,threshold call random_number(random) random_index=int(aint(mass_halo(i)*random))+1 random_index_arr(j)=random_index enddo
Code:test = .true. do while (test) do j=1,threshold do l=j+1,threshold if (random_index_arr(l) == random_index_arr(j)) then if (random_index_arr(j) < mass_halo(i)) then call random_number(random) random_index=int(aint(mass_halo(i)*random))+1 random_index_arr(l)=random_index endif endif enddo enddo do j=1,threshold do l=j+1,threshold test=.false. if (random_index_arr(l) == random_index_arr(j)) then test=.true. endif enddo enddo enddo
Le problème, c'est que c'est très, très, vraiment très lent.
Et je ne vois plus vraiment comment optimiser. Je suis donc ouvert à toute suggestion. J'ai aussi pensé trier mon tableau, mais le fait est qu'il peut avoir plus d'1M d'élement, est-ce jouable avec des tris en n.ln(n)?
Je vous tiens au courant, si j'ai d'autre idée, qui sait, ça servira peut être à quelqu'un.
Merci par avance!
-----