/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Rand()
Fra : AHR


Dato : 01-10-03 18:03

Hej NG

Hvad er det nu jeg skal skrive for at lave et random tal fra f.eks. 1-100?

Når jeg benytter rand() giver den samme tal hver gang jeg benytter
programmet. Hvad er det jeg skal skrive for at de bliver forskelligt?

Tak
AHR



 
 
Bertel Brander (01-10-2003)
Kommentar
Fra : Bertel Brander


Dato : 01-10-03 18:40

AHR wrote:
> Hej NG
>
> Hvad er det nu jeg skal skrive for at lave et random tal fra f.eks. 1-100?
rand()%100 + 1
>
> Når jeg benytter rand() giver den samme tal hver gang jeg benytter
> programmet. Hvad er det jeg skal skrive for at de bliver forskelligt?

srand(time(0))

/b


Kent Friis (01-10-2003)
Kommentar
Fra : Kent Friis


Dato : 01-10-03 18:45

Den Wed, 01 Oct 2003 19:39:37 +0200 skrev Bertel Brander:
>AHR wrote:
>> Hej NG
>>
>> Hvad er det nu jeg skal skrive for at lave et random tal fra f.eks. 1-100?
>rand()%100 + 1


"If you want to generate a random integer between 1
and 10, you should always do it by

j=1+(int) (10.0*rand()/(RAND_MAX+1.0));

and never by anything resembling

j=1+((int) (1000000.0*rand()) % 10);

(which uses lower-order bits)."

fra "man rand".

Mvh
Kent
--
If you think about it, Windows XP is actually the OS that
started as "Microsoft OS/2 NT 3.0"

Bertel Brander (01-10-2003)
Kommentar
Fra : Bertel Brander


Dato : 01-10-03 20:22

Kent Friis wrote:
> Den Wed, 01 Oct 2003 19:39:37 +0200 skrev Bertel Brander:
>
>>AHR wrote:
>>
>>>Hej NG
>>>
>>>Hvad er det nu jeg skal skrive for at lave et random tal fra f.eks. 1-100?
>>
>>rand()%100 + 1
>
>
>
> "If you want to generate a random integer between 1
> and 10, you should always do it by
>
> j=1+(int) (10.0*rand()/(RAND_MAX+1.0));
>
> and never by anything resembling
>
> j=1+((int) (1000000.0*rand()) % 10);
>
> (which uses lower-order bits)."
>
> fra "man rand".

Man kan undre sig over at man laver en random generator der er
så dårlig at man skal bruge ovenstående for at få et ordentlig
resultat og samtidig bruger tid på at fortælle at den er dårlig,
i stedet for at lave en ordentlig random generator.

Det er da rigtigt at nogle random generatorer vil give dårlige
resultater ved at bruge rand()%N direkte, men det gælder mest for
små værdier af N, jeg er ikke sikker på at 100 er en lille værdi
for N.

Min version af man (cygwin) fortæller i øvrigt intet om at man ikke
bør bruge rand()%N direkte.

/b


Mogens Hansen (01-10-2003)
Kommentar
Fra : Mogens Hansen


Dato : 01-10-03 21:52


"Bertel Brander" <bertel@post4.tele.dk> wrote in message
news:3f7b28e5$0$54774$edfadb0f@dread11.news.tele.dk...


[8<8<8<]
> Min version af man (cygwin) fortæller i øvrigt intet om at man ikke
> bør bruge rand()%N direkte.


Hvis "rand" giver en jævn fordeling af tilfældige tal i intervallet
[0,RAND_MAX] og man ønsker en tilsvarende jævn fordeling i intervallet
[0,n[ er man nok nødt til at bruge en funktion i stil med:

<C++ kode>
int nrand(int n)
{
if (n <= 0 || n > RAND_MAX)
throw domain_error("Argument to nrand is out of range");

const int bucket_size = RAND_MAX / n;
int r;

do r = rand() / bucket_size;
while (r >= n);

return r;
}
<C++ kode/>

Se den udemærkede bog
Accelerated C++
Andrew Koenig, Barbara E. Moo
ISBN 0-201-70353-X
side 135 for yderligere detaljer

Venlig hilsen

Venlig hilsen

Mogens Hansen



Jens Axel Søgaard (02-10-2003)
Kommentar
Fra : Jens Axel Søgaard


Dato : 02-10-03 07:14

Bertel Brander wrote:

> Man kan undre sig over at man laver en random generator der er
> så dårlig at man skal bruge ovenstående for at få et ordentlig
> resultat og samtidig bruger tid på at fortælle at den er dårlig,
> i stedet for at lave en ordentlig random generator.

Er det ikke på grund af portabilitet?

Selvom rand er er god på et system, udelukker det ikke, at
rand på et andet system er dårlig. Det er vist så mange
år siden, at problemerne med de tidlige rand-implementationer
blev opdaget, at det skulle undre mig, hvis de ikke er væsentlig
forbedrede i mellemtiden.

Hvis man vil være sikker på kvaliteten af tilfældighedsgeneratoren
på tværs af operativesystemer, så gør man nok klogt i at inkludere
en specifik implementation i ens system. Men hvis man har brug
for det, så ved man det sikkert selv allerede.

Se eventuelt kapitel 7 i:

<http://www.library.cornell.edu/nr/bookcpdf.html>

--
Jens Axel Søgaard


Martin Moller Peders~ (02-10-2003)
Kommentar
Fra : Martin Moller Peders~


Dato : 02-10-03 12:20

In <3f7bc250$0$97235$edfadb0f@dread12.news.tele.dk> =?ISO-8859-1?Q?Jens_Axel_S=F8gaard?= <usenet@jasoegaard.dk> writes:

>Bertel Brander wrote:

>> Man kan undre sig over at man laver en random generator der er
>> så dårlig at man skal bruge ovenstående for at få et ordentlig
>> resultat og samtidig bruger tid på at fortælle at den er dårlig,
>> i stedet for at lave en ordentlig random generator.

>Er det ikke på grund af portabilitet?

Nej, problemet er at N ikke normalt gaar op i RAND_MAX.

Saa hvis f.x. RAND_MAX=10 og N=9, saa
vil rand()%N jo give 0 dobbelt saa mange gange som f.x. 2

/Martin



Jens Axel Søgaard (02-10-2003)
Kommentar
Fra : Jens Axel Søgaard


Dato : 02-10-03 15:11

Martin Moller Pedersen wrote:
> In <3f7bc250$0$97235$edfadb0f@dread12.news.tele.dk> =?ISO-8859-1?Q?Jens_Axel_S=F8gaard?= <usenet@jasoegaard.dk> writes:
>
>
>>Bertel Brander wrote:
>
>
>>>Man kan undre sig over at man laver en random generator der er
>>>så dårlig at man skal bruge ovenstående for at få et ordentlig
>>>resultat og samtidig bruger tid på at fortælle at den er dårlig,
>>>i stedet for at lave en ordentlig random generator.
>>
>
>>Er det ikke på grund af portabilitet?
>
>
> Nej, problemet er at N ikke normalt gaar op i RAND_MAX.
>
> Saa hvis f.x. RAND_MAX=10 og N=9, saa
> vil rand()%N jo give 0 dobbelt saa mange gange som f.x. 2

Det er årsagen, at det er dårlig ide at bruge rand()%N.

Men næppe årsag til, at man skriver, at man ikke skal
bruge rand() overhovedet?

(Men jeg har muligvis misforstået Bertels spørgsmål.)

--
Jens Axel Søgaard


Kent Friis (02-10-2003)
Kommentar
Fra : Kent Friis


Dato : 02-10-03 16:28

Den Thu, 02 Oct 2003 16:11:16 +0200 skrev Jens Axel Søgaard:
>Martin Moller Pedersen wrote:
>> In <3f7bc250$0$97235$edfadb0f@dread12.news.tele.dk> =?ISO-8859-1?Q?Jens_Axel_S=F8gaard?= <usenet@jasoegaard.dk> writes:
>>
>>
>>>Bertel Brander wrote:
>>
>>
>>>>Man kan undre sig over at man laver en random generator der er
>>>>så dårlig at man skal bruge ovenstående for at få et ordentlig
>>>>resultat og samtidig bruger tid på at fortælle at den er dårlig,
>>>>i stedet for at lave en ordentlig random generator.
>>>
>>
>>>Er det ikke på grund af portabilitet?
>>
>>
>> Nej, problemet er at N ikke normalt gaar op i RAND_MAX.
>>
>> Saa hvis f.x. RAND_MAX=10 og N=9, saa
>> vil rand()%N jo give 0 dobbelt saa mange gange som f.x. 2
>
>Det er årsagen, at det er dårlig ide at bruge rand()%N.
>
>Men næppe årsag til, at man skriver, at man ikke skal
>bruge rand() overhovedet?

Hvem har sagt man ikke skal bruge rand() overhovedet?

Mvh
Kent
--
You haven't seen _multitasking_ until you've seen Railroad
Tycoon II and Unreal Tournament run side by side

Bertel Brander (02-10-2003)
Kommentar
Fra : Bertel Brander


Dato : 02-10-03 19:15

Jens Axel Søgaard wrote:
> Martin Moller Pedersen wrote:
>
>> In <3f7bc250$0$97235$edfadb0f@dread12.news.tele.dk>
>> =?ISO-8859-1?Q?Jens_Axel_S=F8gaard?= <usenet@jasoegaard.dk> writes:
>>
>>
>>> Bertel Brander wrote:
>>
>>
>>
>>>> Man kan undre sig over at man laver en random generator der er
>>>> så dårlig at man skal bruge ovenstående for at få et ordentlig
>>>> resultat og samtidig bruger tid på at fortælle at den er dårlig,
>>>> i stedet for at lave en ordentlig random generator.
>>>
>>>
>>
>>> Er det ikke på grund af portabilitet?
>>
>>
>>
>> Nej, problemet er at N ikke normalt gaar op i RAND_MAX.
>>
>> Saa hvis f.x. RAND_MAX=10 og N=9, saa
>> vil rand()%N jo give 0 dobbelt saa mange gange som f.x. 2
>
>
> Det er årsagen, at det er dårlig ide at bruge rand()%N.
>
> Men næppe årsag til, at man skriver, at man ikke skal
> bruge rand() overhovedet?
>
> (Men jeg har muligvis misforstået Bertels spørgsmål.)
>
Tillad mig at uddybe lidt, nu jeg har tænkt over problemet.

Der er to potentielle problemer med rand(), det ene er det
der er beskrevet ovenfor, at hvis N ikke går op i RAND_MAX
vil nogle tal komme oftere end andre. Men hvis RAND_MAX
er meget større end N er problemet meget lille.

Det andet problem er så at nogle rand() genererer tal hvis
mindst betydende cifre ikke er tilfældige, man kan f.ex
tænke sig til at rand()%2 vil give 1 0 1 0 1 0.

Begge problemer burde være ubetydelige hvis man har en god
random generator og man ikke er hysterisk med performance.
Hvis dette ikke er tilfældet, vil jeg anbefale den metode
Kent Friis beskriver.

Hvis man er meget hysterisk med sin random generator bør man
nok ikke forlade sig på kompilerens egen, men til almidelig
hjemme brug er rand() glimrende.

/b


Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409081
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste