|
| RAND_MAX Fra : Harald Mossige |
Dato : 01-03-09 04:42 |
|
Følgende program kjører uten linjen med: "RAND_MAX = (10);"
Hvordan angir jeg ny RAND_MAX?
Jeg er /helt/ fersk C-bruker.
HM
------------
#include <iostream>
/*print Farenheit-Celsius table
for farh = 0, 20, ..., 300*/
int main()
{
int farh,celsius;
int lower,upper, step;
int limit;
lower = 0;
upper = 300;
step = 20;
farh = lower;
RAND_MAX = (10);
while (farh <= upper)
{
limit = rand();
celsius = 5 * (farh - 32) / 9;
printf("%d\t%d\n",farh, limit);
farh = farh + step;
}
}
| |
Arne Vajhøj (01-03-2009)
| Kommentar Fra : Arne Vajhøj |
Dato : 01-03-09 06:00 |
|
Harald Mossige wrote:
> Følgende program kjører uten linjen med: "RAND_MAX = (10);"
>
> Hvordan angir jeg ny RAND_MAX?
>
> Jeg er /helt/ fersk C-bruker.
> RAND_MAX = (10);
RAND_MAX angiver maximum for de tilfældige tal som rand()
funktionen returnerer.
Du kan ikke ændre den værdi.
Hvad vil du opnå med den linie ?
Arne
| |
Harald Mossige (01-03-2009)
| Kommentar Fra : Harald Mossige |
Dato : 01-03-09 06:13 |
|
Arne Vajhøj skreiv:
> Harald Mossige wrote:
>> Følgende program kjører uten linjen med: "RAND_MAX = (10);"
>>
>> Hvordan angir jeg ny RAND_MAX?
>>
>> Jeg er /helt/ fersk C-bruker.
>
>> RAND_MAX = (10);
>
> RAND_MAX angiver maximum for de tilfældige tal som rand()
> funktionen returnerer.
>
> Du kan ikke ændre den værdi.
>
> Hvad vil du opnå med den linie ?
Jeg ønsker å trekke ut et tilfeldig heltall mellom 0 og a der a kan
varieres gjennom programmet, helst som en fungsjon
RANDMAX = [fungsjon]
HM
| |
Bertel Brander (01-03-2009)
| Kommentar Fra : Bertel Brander |
Dato : 01-03-09 16:45 |
|
Harald Mossige skrev:
> Jeg ønsker å trekke ut et tilfeldig heltall mellom 0 og a der a kan
> varieres gjennom programmet, helst som en fungsjon
>
> RANDMAX = [fungsjon]
Som sagt kan du ikke ændre RANDMAX.
En populær (men vist ikke 100% matematisk korrekt) metode
til at få et tilfældigt tal mellem 0 og a er at bruge:
rand()%a
0 er inkluderet i det range du får, a er ikke.
| |
Harald Mossige (01-03-2009)
| Kommentar Fra : Harald Mossige |
Dato : 01-03-09 18:52 |
|
Bertel Brander skreiv:
> Harald Mossige skrev:
>> Jeg ønsker å trekke ut et tilfeldig heltall mellom 0 og a der a kan
>> varieres gjennom programmet, helst som en fungsjon
>>
>> RANDMAX = [fungsjon]
>
> Som sagt kan du ikke ændre RANDMAX.
> En populær (men vist ikke 100% matematisk korrekt) metode
> til at få et tilfældigt tal mellem 0 og a er at bruge:
>
> rand()%a
>
> 0 er inkluderet i det range du får, a er ikke.
Takk, det ser ut til å fungere til mitt bruk. Jeg tror jeg aner hva som
skjer, men finner det ikke nevnt i K&R II. Er det jeg som ikke leser
grundig nok?
HM
| |
Kent Friis (01-03-2009)
| Kommentar Fra : Kent Friis |
Dato : 01-03-09 19:03 |
|
Den Sun, 01 Mar 2009 16:44:59 +0100 skrev Bertel Brander:
> Harald Mossige skrev:
>> Jeg ønsker å trekke ut et tilfeldig heltall mellom 0 og a der a kan
>> varieres gjennom programmet, helst som en fungsjon
>>
>> RANDMAX = [fungsjon]
>
> Som sagt kan du ikke ændre RANDMAX.
> En populær (men vist ikke 100% matematisk korrekt) metode
> til at få et tilfældigt tal mellem 0 og a er at bruge:
>
> rand()%a
>
> 0 er inkluderet i det range du får, a er ikke.
Fra manualen til rand():
"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);
Mvh
Kent
--
Hvis en sort kat går over vejen foran en bil, betyder det ulykke
.... for katten.
| |
Arne Vajhøj (01-03-2009)
| Kommentar Fra : Arne Vajhøj |
Dato : 01-03-09 19:23 |
|
Kent Friis wrote:
> Den Sun, 01 Mar 2009 16:44:59 +0100 skrev Bertel Brander:
>> Harald Mossige skrev:
>>> Jeg ønsker å trekke ut et tilfeldig heltall mellom 0 og a der a kan
>>> varieres gjennom programmet, helst som en fungsjon
>>>
>>> RANDMAX = [fungsjon]
>> Som sagt kan du ikke ændre RANDMAX.
>> En populær (men vist ikke 100% matematisk korrekt) metode
>> til at få et tilfældigt tal mellem 0 og a er at bruge:
>>
>> rand()%a
>>
>> 0 er inkluderet i det range du får, a er ikke.
>
> Fra manualen til rand():
>
> "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);
Mærkelig manual !
Den sidste linie kode er total absurd.
Hvis der ikke er overflow, så vil den altid returnere 1.
Hvis der er overflow kan den returnere sære værdier (jeg
få rigtigt mange -7).
Til at generere uniform fordelte tal i intervallet 1 til 10
er den totalt håbløs.
Hvorfor advarer man lige netop mod den og ikke:
j = 1;
og
int *r = (int *)rand();
j = *r;
?
Arne
| |
Kent Friis (01-03-2009)
| Kommentar Fra : Kent Friis |
Dato : 01-03-09 20:46 |
|
Den Sun, 01 Mar 2009 13:22:36 -0500 skrev Arne Vajhøj:
> Kent Friis wrote:
>> Den Sun, 01 Mar 2009 16:44:59 +0100 skrev Bertel Brander:
>>> Harald Mossige skrev:
>>>> Jeg ønsker å trekke ut et tilfeldig heltall mellom 0 og a der a kan
>>>> varieres gjennom programmet, helst som en fungsjon
>>>>
>>>> RANDMAX = [fungsjon]
>>> Som sagt kan du ikke ændre RANDMAX.
>>> En populær (men vist ikke 100% matematisk korrekt) metode
>>> til at få et tilfældigt tal mellem 0 og a er at bruge:
>>>
>>> rand()%a
>>>
>>> 0 er inkluderet i det range du får, a er ikke.
>>
>> Fra manualen til rand():
>>
>> "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);
>
> Mærkelig manual !
>
> Den sidste linie kode er total absurd.
>
> Hvis der ikke er overflow, så vil den altid returnere 1.
Det har du da ret i. Gad vide om den der har skrevet manualen
har troet den returnerede en float mellem 0 og 1... Ellers kan
jeg ikke se hvordan 1000000.0* giver mening.
> Hvis der er overflow kan den returnere sære værdier (jeg
> få rigtigt mange -7).
Det gør jeg også.
Mvh
Kent
--
Hvis en sort kat går over vejen foran en bil, betyder det ulykke
.... for katten.
| |
Morten Nissen (22-03-2009)
| Kommentar Fra : Morten Nissen |
Dato : 22-03-09 23:38 |
|
>
> rand()%a
Problemet er ved ovenstående løsning at du bliver nød til at smide den
sidste del af kagen ud. (Med mindre at a går op i RANDMAX) Tænk
eksemplet ned til at RANDMAX = 5 og du vil have et tilfældigt til mellem
0 og 3, hvad er resultatet når rand() er 4? Der vil være en teoretisk
overhyppighed. (Ikke meget, men sikkert nok til at nogen ville blive
sure på danske spil.)
../Morten
| |
Harald Mossige (23-03-2009)
| Kommentar Fra : Harald Mossige |
Dato : 23-03-09 00:40 |
|
Morten Nissen skreiv:
>>
>> rand()%a
>
> Problemet er ved ovenstående løsning at du bliver nød til at smide den
> sidste del af kagen ud. (Med mindre at a går op i RANDMAX) Tænk
> eksemplet ned til at RANDMAX = 5 og du vil have et tilfældigt til mellem
> 0 og 3, hvad er resultatet når rand() er 4? Der vil være en teoretisk
> overhyppighed. (Ikke meget, men sikkert nok til at nogen ville blive
> sure på danske spil.)
Og din løsning på åroblrmrt er?
For helhetens skyld, starter jeg med RAND()%1 og inkrementerer opp mot
10. Betyr det at oppgaven i praksis er uløselig? Med RAND()%a, der a =
5, hvor mange trekk er nødvendig for å dekke alle mulige resultat, 0-5?
HM
| |
Arne Vajhøj (23-03-2009)
| Kommentar Fra : Arne Vajhøj |
Dato : 23-03-09 01:04 |
|
Harald Mossige wrote:
> Morten Nissen skreiv:
>>> rand()%a
>>
>> Problemet er ved ovenstående løsning at du bliver nød til at smide den
>> sidste del af kagen ud. (Med mindre at a går op i RANDMAX) Tænk
>> eksemplet ned til at RANDMAX = 5 og du vil have et tilfældigt til
>> mellem 0 og 3, hvad er resultatet når rand() er 4? Der vil være en
>> teoretisk overhyppighed. (Ikke meget, men sikkert nok til at nogen
>> ville blive sure på danske spil.)
>
> Og din løsning på åroblrmrt er?
Der er flere mulige løsninger.
Men en af de simple er:
do
{
v = rand();
} while(v > RAND_MAX - RAND_MAX % a);
v = v % a;
Arne
| |
|
|