View Full Version : borland e random
Non riesco a capire come si utilizza randomize in borland: dovrei farmi stampare quattro numeri casuali, compresi tra 0 e 9 ma diversi tra loro
ex:
a=9
b=4
c=1
d=8
grazie a chi mi aiuterà
Byezzzzzzz:sofico: zzzzzzzz
DarkTemplar
20-02-2005, 20:00
Randomize lo scrivi una sola volta in tutto il programma.
Solitamente lo scrivo dopo aver dichiarato le variabili nel main.
P.S.:non sono un esperto.
Ma che linguaggio è ? Se è C/C++ puoi sempre usare le funzioni standard...
C++e uso borland
Byezzzzzzz:sofico: zzzzzzzzzzzzzzz
Ma Borland quale ? Che versione ?
Comunque puoi usare queste istruzioni standard:
#include <time.h>
#include <stdlib.h>
Poi da richiamare una sola volta nel tuo programma:
srand((unsigned)time(NULL)); //se non ti funziona richiama randomize(); contenuta in conio.h, ma è la versione non standard supportata solo da Borland
Per avere un numero random tra 0 e N-1:
int num = ((double)rand())/(RAND_MAX+1) * N; //se non ti funziona devi usare il corrispondente che funziona solo su Borland: random(N);
Fenomeno85
21-02-2005, 09:41
guarda cerca nell'help del borlan ci sono gli esempi fai prima ;)
~§~ Sempre E Solo Lei ~§~
Il problema è che non voglio che i numeri siano ripetuti: non è tanto la funzione random, quanto non riesco a capire come non farli apparire uguali. Cioè sull'help non so come si chiama la funzione di disuguaglianza o diverso.
Byezzzzzzz:sofico: zzzzzzzzzzzz
La versione di vorland è Borland builder 5.
Byezzzzzzz:sofico: zzzzzzzzzz
Fenomeno85
21-02-2005, 15:26
Originariamente inviato da ALIEN3
Il problema è che non voglio che i numeri siano ripetuti: non è tanto la funzione random, quanto non riesco a capire come non farli apparire uguali. Cioè sull'help non so come si chiama la funzione di disuguaglianza o diverso.
Byezzzzzzz:sofico: zzzzzzzzzzzz
ahhh ho capito quello che intendi ... te dici una cosa del genere:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
int Value(){
return (rand()%10);
}
int main (void){
int a, b, c, d;
srand (time (NULL));
a = Value();
do{
b = Value();
}while (b==a);
do{
c = Value();
}while (c==a || c==b);
do{
d = Value();
}while (d==a || d==b || d==c);
printf ("a:\t%d\nb:\t%d\nc:\t%d\nd:\t%d\n",a,b,c,d);
system ("PAUSE");
return (0);
}
è l'unico metodo dato che rand non si può ricordare quale valore ha restituito.
~§~ Sempre E Solo Lei ~§~
Così è errato perchè può portare in teoria ad un ciclo infinito...
Mentre per quattro variabili:
#define N 10
int main (void){
int a, b, c, d;
srand (time (NULL));
a = Value(N);
b = Value(N-1);
if (b==a)
{
++b;
}
c = Value(N-2);
if(c>=a && c>=b) c+=2;
else if(c>=a || c>=b) ++c;
while (c==a || c==b)
++c;
d = Value(N-3);
if(d>=a && d>=b && d>=c) d+=3
else if((d>=a && d>=b) || (d>=a && d>=c) || (d>=c && d>=b)) d+=2;
else if(d>=a || d>=b || d>=c) ++d;
while (d==a || d==b || d==c)
++d;
printf ("a:\t%d\nb:\t%d\nc:\t%d\nd:\t%d\n",a,b,c,d);
system ("PAUSE");
return 0;
}
Se ne può fare anche una versione per un numero generico di variabili...
Fenomeno85
22-02-2005, 16:10
scusa ma così ristringo sempre il campo ... non perdo valori??
~§~ Sempre E Solo Lei ~§~
Originariamente inviato da Fenomeno85
scusa ma così ristringo sempre il campo ... non perdo valori??
~§~ Sempre E Solo Lei ~§~
No perchè se vuoi una estrazione senza ripetizione (pensa ad esempio alla tombola)...ad ogni estrazioni i possibili numeri che possono uscire diminuiscono sempre ;)
Fenomeno85
22-02-2005, 16:28
si ok ma io non elimino il valore estratto ma l'ultimo del range
~§~ Sempre E Solo Lei ~§~
Azzz...ho sbagliato :doh: Correggo... Magari con questa corezzione capirai meglio ciò che voglio fare (che rispetta la distribuzione statistica)...
Fenomeno85
22-02-2005, 17:18
noo cade un mito :D
~§~ Sempre E Solo Lei ~§~
In pratica i numeri estratti che hanno comunque una numerazione da 0 a N-2 (prendendo per esempio l'ultimo estratto), sono di fatto l'indice del numero da estrarre all'interno della popolazione rimasta...
Ad esempio da 1 a 10 estraggo 3 e 7...ora voglio estrarre un altro numero...
Estraggo un numero da 1 a 8...mettiamo sia 6...
I numeri rimasti da estrarre sono 1,2,4,5,6,8,9,10...quindi il sesto esemplare di questa popolazione è il numero 8 ;) Il codice sopra vuole fare questo...
Ovviamente per fare estrazioni di questo tipo si fa prima con una funzione generica...
Fenomeno85
22-02-2005, 17:38
ok capito :D
~§~ Sempre E Solo Lei ~§~
Ad esempio questo codice per niente ottimizzato fa al caso suo:
/* estrazione senza reimbussolamento di m elementi
su una popolazione di n elementi (da 1 a n) */
int vettore_casuale(int *v, int m, int n)
{
char *v2;
int i, j;
if(m > n)
return 1;
v2 = (char *) calloc(n, sizeof(char));
for(i=0; i<m; i++)
{
v[i] = (((double)rand())/RAND_MAX)*(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;
}
Altre soluzioni sarebbero molto semplici (come codice, ma magari di una durata temporale maggiore)...ad esempio tramite un vector in C++ che contiene tutti gli elementi della popolazione...man mano che un elemento viene estratto basta indicizzarlo tramite il numero random tirato su e successivamente eliminarlo dal vettore con erase...
Non mi collego un giorno e trovo tutto questa bella robba da sperimentare ;)
Byezzzzzzzz:sofico: zzzzzzzzzzz
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.