» »

[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????
/*
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…

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...

Zgodovina sprememb…

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…

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

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.
Great are mysteries of the mind ... or not?

Tutankhamun ::

hypnotic, sej točn to sm js zgori napisu :).
AMD Phenom QUAD 9950 Black Edition, 8GB

norcuron ::

Aja, vidš k nisem sploh kodo gledu, sam spravu sem se pisat :)

Hehehehe :D
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. :D
Great are mysteries of the mind ... or not?

Nuke_H2 ::

Sm je res uporabna metoda :)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

[C] - Spreminjanje programa s pointerji

Oddelek: Programiranje
61202 (954) DaMachk
»

naloga ne funkcionira

Oddelek: Programiranje
101457 (1366) FX6300B
»

c napaka .c:4:1: error: expected identifier or '(' before '{' token

Oddelek: Programiranje
141957 (1530) MrStein
»

[C] Procesi

Oddelek: Programiranje
6987 (896) Cvenemir
»

[C++] dinamično 2d polje

Oddelek: Programiranje
143291 (3128) bozjak

Več podobnih tem