14 svar
83 visningar
solaris är nöjd med hjälpen!
solaris 139
Postad: 30 dec 2018

Är a ett random number mellan -100 och 100?

 

Hej jag har en kod och är inte riktigt säker om a är ett tal mellan -100 och 100 eftersom man inte 100% kan kolla det

double r = Math.random();
double x = -100+200*r;
int a = (int) x;
System.out.println(a);

Laguna 2611
Postad: 30 dec 2018

Du kan ju köra tusen gånger och kolla hur ofta varje tal uppträder. 

Vill du att -100 och 100 ska vara med? Vet du vad (int) 0.7 blir? Och (int) -0.7? Det påverkar hur det blir när x är nära noll. 

solaris 139
Postad: 30 dec 2018

okej så 0 uppträder oftare eftersom 0.7 och -0.7 blir både 0. Så hur ska jag då göra för att får ett rand nr mellan -100 0 100 där 100 och -100 är med? ska jag annvända double x = -1+2*r; --> -1<=x<1 och sedan använda det i a men hur ska jag formulera a?

Laguna 2611
Postad: 30 dec 2018 Redigerad: 30 dec 2018
solaris skrev:

okej så 0 uppträder oftare eftersom 0.7 och -0.7 blir både 0. Så hur ska jag då göra för att får ett rand nr mellan -100 0 100 där 100 och -100 är med? ska jag annvända double x = -1+2*r; --> -1<=x<1 och sedan använda det i a men hur ska jag formulera a?

Jag föreslår att du lägger till -100 sist, och alltså först gör ett heltal med 0 som minsta värde och 200 som största.

Edit: tillägg: alternativt gör som du gör nu, ungefär, men med 'floor' i stället för (int).

solaris 139
Postad: 30 dec 2018

double r = Math.random();
int x = (int)200*r;
int a = x-100;

e det ungefär så du tänkte?

Laguna 2611
Postad: 30 dec 2018
solaris skrev:

double r = Math.random();
int x = (int)200*r;
int a = x-100;

e det ungefär så du tänkte?

Ja, men jag är inte övertygad om att (int) 200*r är samma sak som (int) (200*r).

Kan du få talet 100 nu? 

solaris 139
Postad: 30 dec 2018

nej jag antar att jag inte kan få 100 eftersom Math.random(); ger ett tal 0<=r<1 och eftersom det aldrig kan va 1 kan det antagligen inte bli 100 heller. men hur ska jag göra för att får 100 då`?

Laguna 2611
Postad: 30 dec 2018
solaris skrev:

nej jag antar att jag inte kan få 100 eftersom Math.random(); ger ett tal 0<=r<1 och eftersom det aldrig kan va 1 kan det antagligen inte bli 100 heller. men hur ska jag göra för att får 100 då`?

Ta lite mer än 200.

Albiki 3140
Postad: 30 dec 2018

Hej!

Om rr är ett slumptal

    0r10\leq r \leq 1

så är -100+200r-100+200r ett slumptal sådant att

    -100-100+200r100-100\leq -100+200r\leq 100.

tomast80 2004
Postad: 30 dec 2018

Det som inte framgår i uppgiften är om man vill att alla tal ska vara lika sannolika att genereras?

Om så är fallet så ska vi sätta upp slumpvariabeln:

XX där P(X=a)=1201 där

a=-100,-99,...,-1,0,1,...,99,100a=-100,-99,...,-1,0,1,...,99,100

Är det ovanstående som efterfrågas skulle jag personligen hellre använda funktionen ceil eller floor. Blir lite tydligare då.

solaris 139
Postad: 30 dec 2018
Laguna skrev:
solaris skrev:

nej jag antar att jag inte kan få 100 eftersom Math.random(); ger ett tal 0<=r<1 och eftersom det aldrig kan va 1 kan det antagligen inte bli 100 heller. men hur ska jag göra för att får 100 då`?

Ta lite mer än 200.

 Då borde det här funka ..?

Postad: 1 timme sedan
double r = Math.random();
int x = (int)(201*r);
int a = x-100;

Laguna 2611
Postad: 30 dec 2018
solaris skrev:
Laguna skrev:
solaris skrev:

nej jag antar att jag inte kan få 100 eftersom Math.random(); ger ett tal 0<=r<1 och eftersom det aldrig kan va 1 kan det antagligen inte bli 100 heller. men hur ska jag göra för att får 100 då`?

Ta lite mer än 200.

 Då borde det här funka ..?

Postad: 1 timme sedan
double r = Math.random();
int x = (int)(201*r);
int a = x-100;

Det borde funka.

För att få bättre avrundning och fördelning skulle jag använda ursprungsansatsen (double x = 200*r - 100), men istället för att bara casta till en int så skulle jag addera 0,5 och sedan använda floor().

Laguna 2611
Postad: 30 dec 2018 Redigerad: 30 dec 2018
Yngve skrev:

För att få bättre avrundning och fördelning skulle jag använda ursprungsansatsen (double x = 200*r - 100), men istället för att bara casta till en int så skulle jag addera 0,5 och sedan använda floor().

Då får jag det till att när r är i [0.9925, 0.9975[ så blir det 99, och i [0.9975, 1[ blir det 100, dvs 100 förekommer bara hälften så ofta som 99.

Edit: rättade skrivfel.

Laguna skrev:
Yngve skrev:

För att få bättre avrundning och fördelning skulle jag använda ursprungsansatsen (double x = 200*r - 100), men istället för att bara casta till en int så skulle jag addera 0,5 och sedan använda floor().

Då får jag det till att när r är i [0.9925, 0.9975[ så blir det 99, och i [0.9975, 1[ blir det 100, dvs 100 förekommer bara hälften så ofta som 99.

Edit: rättade skrivfel.

Ja det har du rätt i.

Då är det bätte att multiplicera med 201, skippa additionen men att ändå använda floor() för bättre fördelning, precis som både du och tomast80 föreslagit.

Svara Avbryt
Close