Forum » Programiranje » [c++] random funkcija brez ponavljanja številk
[c++] random funkcija brez ponavljanja številk
asuseeepc ::
Najprej en lep pozdrav.
Z pomočjo random funkcije želim narediti program, ki nebo vračal podvojenih vrednosti (vsaka številka se nej pojavila le enkrat). Napisal sem sledeč program in ga spreminjal po nasvetih na internetu a nič ni delovalo. Zania me kako na najbolj enostaven način doseči tak rezultat????
bega me predvsem srand (time(NULL) ); kej tudi mislim da je rešitev tega problema
Z pomočjo random funkcije želim narediti program, ki nebo vračal podvojenih vrednosti (vsaka številka se nej pojavila le enkrat). Napisal sem sledeč program in ga spreminjal po nasvetih na internetu a nič ni delovalo. Zania me kako na najbolj enostaven način doseči tak rezultat????
/* int main() { int stevilo[10], i; srand (time(NULL) ); for (i=0;i<10;i++){ stevilo[i]= rand() % 10; cout<<i<<" "<<stevilo[i]; cout<<endl; } return 0; }
bega me predvsem srand (time(NULL) ); kej tudi mislim da je rešitev tega problema
misek ::
Poskusi tole (iz man rand):
"If you want to generate a random integer between 1 and 10, you should always do it by using high-order bits, as in
j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
and never by anything resembling
j=1+(rand() % 10);
which uses lower-order bits)."
Tutankhamun ::
Če sm prov zastopu nj bi se izpisale številke od 0 - 9 pomešane med sabo.
srand (time (NULL)); int values [] = {0,1,2,3,4,5,6,7,8,9}; for (int count = 10; count > 0; count--) { int index = rand () % count; cout << values [index] << endl; values [index] = values [count - 1]; }
AMD Phenom QUAD 9950 Black Edition, 8GB
Zgodovina sprememb…
- spremenil: Tutankhamun ()
asuseeepc ::
Ja prav si zastopil kaj želim narediti. Tvoj program deluje super tako da se hvala za pomoč Tutankhamun .
j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
pa na žalost vrača tudi podvojene vrednosti...
j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
pa na žalost vrača tudi podvojene vrednosti...
Zgodovina sprememb…
- spremenil: asuseeepc ()
Jean-Paul ::
j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
pa na žalost vrača tudi podvojene vrednosti...
Jasno. Primer: imaš žaro z 10 kroglicami (s številkami od 1 do 10). Sedaj iz te žare naključno žrebaš 11 krat (z vračanjem kroglic v žaro). In ti pričakuješ, da se ti nobena izžrebana vrednost ne bo ponovila?
Zgodovina sprememb…
- spremenil: Jean-Paul ()
Nuke_H2 ::
Kako bi pa tak primer izgledal v javi?
Ker jaz imam podoben problem:
1. int tab[]=new int[9];
2. z=(int)(Math.random()*10);
3. vrednost z bi vpisal v tabelo tab le če je še nebi bilo v tabeli to se pravi, da se v tabeli tab nebi smela nobena številka ponoviti...
Lp H2O
Ker jaz imam podoben problem:
1. int tab[]=new int[9];
2. z=(int)(Math.random()*10);
3. vrednost z bi vpisal v tabelo tab le če je še nebi bilo v tabeli to se pravi, da se v tabeli tab nebi smela nobena številka ponoviti...
Lp H2O
Tutankhamun ::
namest vrstice s cout << ... Napiši tab [10 - count] = values [index]; to biti to. C prevest v javo ti pa vrjetn ni težko Random pa mislm da je bol tko Random r = new Random(); int index = r.nextInt(10);
AMD Phenom QUAD 9950 Black Edition, 8GB
norcuron ::
Ena taka uporabna stvar glede randoma in raznih žrebanj, ko želimo zagotoviti, da se nobena žrebana številka ne ponovi, je uporaba Durstenfeldove implementacije Fisher-Yates algoritma.
Gre v bistvu za enostavno zadevo, ideja je pa v tem, da pripravimo tabelo, v kateri so možne številke (recimo od 1 do 10). Na vsakem koraku izžrebamo indeks v tabeli, s katerega potem "poberemo" številko. To številko potem zamenjamo z zadnjo v tabeli in tabelo "skrajšamo" preden žrebamo naslednjo število.
Tko nekak bi zgledalo, če bi žrebal 3 številke od 1 do 10:
- žrebaš z uporabo built-in randoma cifro med 1 in 10 (dejansko žrebaš indeks v tabeli, nulti indeks zarad poenostavitve lahko pustiš) - vsebina tabele je torej {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
- žreba ti recimo število 3, trojko si nekam zapišeš kot prvo žrebano število
- zdaj pa na indeks 3 prepišeš cifro iz zadnjega indeksa, torej 10, tako, da imaš po prvem žrebu tabelo {0, 1, 2, 10, 4, 5, 6, 7, 8, 9, 10}
- zdaj, ko greš žrebat naslednjo cifro, pa zmanjšaš zgornjo mejo za 1, torej žrebaš med 1 in 9
- in recimo, da ti spet built-in random žreba število 3, kar se komot zgodi
- zdaj vzameš spet vrednost na indeksu 3 in dobiš kot drugo žrebano cifro, število 10
- in postopek ponoviš pred žrebanjem še zadnje cifre (na indeks 3 prepišeš cifro iz zadnjega indeksa - 10 si prej odrezal, ker si žrebal od 1 do 9, torej zapišeš 9 in pred zadnjim žrebanjem je tabela takale {1, 2, 9, 4, 5, 6, 7, 8, 9, 10}
- greš spet žrebat, samo zdaj od 1 do 8 in če spet dobiš žrebano trojko, boš vzel cifro 9, ki je zapisana na indeksu 3
Tko nekak gre tole, upam, da nisem preveč zakompliciral. Žrebaš lahko do konca in nikoli se žrebana številka ne bo ponovila - ponavlja se pa lahko žrebani indeks.
Gre v bistvu za enostavno zadevo, ideja je pa v tem, da pripravimo tabelo, v kateri so možne številke (recimo od 1 do 10). Na vsakem koraku izžrebamo indeks v tabeli, s katerega potem "poberemo" številko. To številko potem zamenjamo z zadnjo v tabeli in tabelo "skrajšamo" preden žrebamo naslednjo število.
Tko nekak bi zgledalo, če bi žrebal 3 številke od 1 do 10:
- žrebaš z uporabo built-in randoma cifro med 1 in 10 (dejansko žrebaš indeks v tabeli, nulti indeks zarad poenostavitve lahko pustiš) - vsebina tabele je torej {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}
- žreba ti recimo število 3, trojko si nekam zapišeš kot prvo žrebano število
- zdaj pa na indeks 3 prepišeš cifro iz zadnjega indeksa, torej 10, tako, da imaš po prvem žrebu tabelo {0, 1, 2, 10, 4, 5, 6, 7, 8, 9, 10}
- zdaj, ko greš žrebat naslednjo cifro, pa zmanjšaš zgornjo mejo za 1, torej žrebaš med 1 in 9
- in recimo, da ti spet built-in random žreba število 3, kar se komot zgodi
- zdaj vzameš spet vrednost na indeksu 3 in dobiš kot drugo žrebano cifro, število 10
- in postopek ponoviš pred žrebanjem še zadnje cifre (na indeks 3 prepišeš cifro iz zadnjega indeksa - 10 si prej odrezal, ker si žrebal od 1 do 9, torej zapišeš 9 in pred zadnjim žrebanjem je tabela takale {1, 2, 9, 4, 5, 6, 7, 8, 9, 10}
- greš spet žrebat, samo zdaj od 1 do 8 in če spet dobiš žrebano trojko, boš vzel cifro 9, ki je zapisana na indeksu 3
Tko nekak gre tole, upam, da nisem preveč zakompliciral. Žrebaš lahko do konca in nikoli se žrebana številka ne bo ponovila - ponavlja se pa lahko žrebani indeks.
Great are mysteries of the mind ... or not?
norcuron ::
Aja, vidš k nisem sploh kodo gledu, sam spravu sem se pisat :)
Hehehehe
Hehehehe
Great are mysteries of the mind ... or not?
WarpedGone ::
je uporaba Durstenfeldove implementacije Fisher-Yates algoritma.
Zelo kompliciran naziv napol trivijalne ideje :)
Zbogom in hvala za vse ribe
norcuron ::
Sej jes sem tut cviknu najprej, ko sem slišal naziv.
Great are mysteries of the mind ... or not?
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [C] - Spreminjanje programa s pointerjiOddelek: Programiranje | 1202 (954) | DaMachk |
» | naloga ne funkcioniraOddelek: Programiranje | 1457 (1366) | FX6300B |
» | c napaka .c:4:1: error: expected identifier or '(' before '{' tokenOddelek: Programiranje | 1957 (1530) | MrStein |
» | [C] ProcesiOddelek: Programiranje | 987 (896) | Cvenemir |
» | [C++] dinamično 2d poljeOddelek: Programiranje | 3291 (3128) | bozjak |