PDA

View Full Version : borland e random


ALIEN3
20-02-2005, 17:18
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.

cionci
20-02-2005, 22:44
Ma che linguaggio è ? Se è C/C++ puoi sempre usare le funzioni standard...

ALIEN3
21-02-2005, 06:59
C++e uso borland

Byezzzzzzz:sofico: zzzzzzzzzzzzzzz

cionci
21-02-2005, 08:54
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 ~§~

ALIEN3
21-02-2005, 14:35
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

ALIEN3
21-02-2005, 14:37
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 ~§~

cionci
22-02-2005, 14:46
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 ~§~

cionci
22-02-2005, 16:16
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 ~§~

cionci
22-02-2005, 17:16
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 ~§~

cionci
22-02-2005, 17:36
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 ~§~

cionci
22-02-2005, 17:44
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...

ALIEN3
22-02-2005, 19:37
Non mi collego un giorno e trovo tutto questa bella robba da sperimentare ;)

Byezzzzzzzz:sofico: zzzzzzzzzzz