|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Senior Member
Iscritto dal: Aug 2003
Città: Rimini
Messaggi: 422
|
Permutazioni Casuali
Ciao a tutti.
Avrei bisogno di aiuto nel creare delle permuazioni casuali di numeri da 1 a N. Per esempio 4 permutazioni a caso di una serie di numeri da 1 a 10. Qualcuno ha in mente come fare senza generarle tutte e po prenderle a caso? Grazie |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Linguaggio ?
|
|
|
|
|
|
#3 |
|
Senior Member
Iscritto dal: Aug 2003
Città: Rimini
Messaggi: 422
|
va benissimo C o C++
|
|
|
|
|
|
#4 |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Codice:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <memory.h>
/* estrazione senza reimbussolamento di m elementi
su una popolazione di n elementi */
int vettore_casuale(int *v, int m, int n)
{
char *v2;
int i, j;
if(m > n)
return 1;
v2 = malloc(sizeof(char)*n);
memset(v2, 0, sizeof(char)*n);
for(i=0; i<m; i++)
{
v[i] = rand()%(n-i) + 1;
j = 0;
while(v[i] > 0 )
{
if(v2[j++] == 0)
v[i]--;
}
v2[j-1] = 1;
v[i] = j;
}
free(v2);
return 0;
}
#define M 10
#define N 10
int main()
{
int v[M], i;
srand((unsigned)time(NULL));
vettore_casuale(v, M, N);
for(i=0; i<M; ++i)
printf("%4d", v[i]);
printf("\n");
vettore_casuale(v, M, N);
for(i=0; i<M; ++i)
printf("%4d", v[i]);
printf("\n");
vettore_casuale(v, M, N);
for(i=0; i<M; ++i)
printf("%4d", v[i]);
printf("\n");
getchar();
return 0;
}
|
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Aug 2003
Città: Rimini
Messaggi: 422
|
Grazie Mille, ora lo provo
|
|
|
|
|
|
#6 |
|
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
Questa è l'implementazione di un noto algoritmo, inventato da non ricordo chi, per generare una permutazione di n elementi con complessità lineare:
Codice:
#include <stdlib.h>
void swap(int *a, int *b){
int temp = *a;
*a = *b;
*b = temp;
}
int * perm(unsigned int n){
int *vect = (int *)malloc(n * sizeof(int));
int i;
for(i = 0; i < n; i++)
vect[i] = i;
for (i = n-1;i >= 0;i--)
swap(&vect[i],&vect[(int) ((rand()/(1.0 + RAND_MAX)) * (i+1))]);
return vect;
}
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals Ultima modifica di anx721 : 23-12-2004 alle 18:23. |
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Aug 2003
Città: Rimini
Messaggi: 422
|
Quote:
Lo stavo proprio implementando cosi, con swap casuali... Ora li provo tutte e due vedo quello che ha prestazioni migliori |
|
|
|
|
|
|
#8 |
|
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
la "mia" credo sia piu efficiente
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
|
|
|
|
|
#9 | |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 752
|
Quote:
Standard shuffling algorithm Seminumerical Algorithms (Vol. 2 of "The Art of Computer Programming") Codice:
for (i=0; i<N; i++)
a[i] = i;
for (j=N-1; j>0; j--) {
i = choose(0,j); /* Generatore di numeri casuale */
t = a[i];
a[i] = a[j];
a[j] = t;
}
Ultima modifica di atidem : 23-12-2004 alle 18:41. |
|
|
|
|
|
|
#10 | |
|
Senior Member
Iscritto dal: Oct 2002
Città: Roma
Messaggi: 1502
|
Quote:
__________________
Sun Certified Java Programmer EUCIP Core Level Certified European Certification of Informatics Professionals |
|
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Oct 2004
Messaggi: 752
|
Quote:
http://www-cs-faculty.stanford.edu/~knuth/index.html Ultima modifica di atidem : 23-12-2004 alle 18:45. |
|
|
|
|
|
|
#12 | |
|
Senior Member
Iscritto dal: Apr 2000
Città: Vicino a Montecatini(Pistoia) Moto:Kawasaki Ninja ZX-9R Scudetti: 29
Messaggi: 53971
|
Quote:
|
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 11:41.



















