/ 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
Bech_bb 500
kyllekylle 500
jdjespers.. 500
gibson 300
scootergr.. 300
molokyle 287
10  strarup 270
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

Søg
Reklame
Statistik
Spørgsmål : 177414
Tips : 31962
Nyheder : 719565
Indlæg : 6407846
Brugere : 218876

Månedens bedste
Årets bedste
Sidste års bedste