14 svar
196 visningar
solaris är nöjd med hjälpen
solaris 238 – Fd. Medlem
Postad: 30 dec 2018 14:02

Ä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 Online 28470
Postad: 30 dec 2018 14:28

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 238 – Fd. Medlem
Postad: 30 dec 2018 15:00

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 Online 28470
Postad: 30 dec 2018 15:22 Redigerad: 30 dec 2018 15:23
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 238 – Fd. Medlem
Postad: 30 dec 2018 16:08

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

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

Laguna Online 28470
Postad: 30 dec 2018 16:25
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 238 – Fd. Medlem
Postad: 30 dec 2018 17:12

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 Online 28470
Postad: 30 dec 2018 17:23
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 5096 – Fd. Medlem
Postad: 30 dec 2018 17:41

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 4209
Postad: 30 dec 2018 17:49

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 238 – Fd. Medlem
Postad: 30 dec 2018 17:50
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 Online 28470
Postad: 30 dec 2018 17:55
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.

Yngve 37823 – Livehjälpare
Postad: 30 dec 2018 21:16

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 Online 28470
Postad: 30 dec 2018 21:25 Redigerad: 30 dec 2018 21:28
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.

Yngve 37823 – Livehjälpare
Postad: 30 dec 2018 21:39
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