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