Generera random mellan 2 tal - Java

Permalänk
Medlem

Generera random mellan 2 tal - Java

Tjo

Sitter och försöker genera ett random tal mellan 2 tal som användaren skriver in. Just nu använder jag mig av en väldigt dålig lösning men som funkar vid lägre tal och stor marginal. Däremot höga tal och liten marginal gör att program tar lång tid på sig eventuellt fryser. Från vad jag fattat så generar "random" ett tal mellan 0 och inskrivet värde men det jag vill göra är så att användaren kan skriva in t.ex. 5-15 och få ett random tal mellan 5 och 15.

Det sättet jag gjort det på (och som ni ser i koden) är att jag generar ett nytt tal om värdet som genererats är mindre än nr1 (första talet använder skriver in). Jag har testat att googla lite men dom lösningarna jag hittar förstår jag inte riktigt så tänkte höra om någon här har någon simpel och effektiv lösning?

int roll; Random diceRoller = new Random(); nr2++; //detta gör jag för att talet genererat ska bli max det värde som använderna skriver in och inte ett lägre for (int i = 0; i < quantityToGenerate; i++) { roll = diceRoller.nextInt(nr2); while (roll < nr1) { roll = diceRoller.nextInt(nr2); } } numbers += roll + " "; equalsTextField.setText(numbers);

Permalänk
Medlem

int low = 5; int high = 15; int roll = diceRoller.NextInt(high-low) + low;

skippa while satsen

edit: fixade ett misstag
Sättet det funkar är att räkna ut skillnaden mellan det höga och det låga talet, och randomiza mellan 0 och det, sen addera på det låga igen. skillnaden mellan 5 och 15 är det 10, så får vi ett tal, säg 2 kanske. Tillslut så adderar vi på det låga talet igen, 2+5 = 7. randomizar du fram 0 blir sluttalet 5, randomizar du 10 blir det 15. Simpelt va?

Visa signatur

Laptop - MacBook 2.0GHz, 4GB ram, Intel GMA 950
Stationär - i5 3570k @ 4ghz, 8gb ram, 120gb ssd + 2tb hdd, Windows 8 64bit, fractal design arc
Citera så jag hittar tillbaka :)

Permalänk
Hedersmedlem
Skrivet av xawiahn:

Det sättet jag gjort det på (och som ni ser i koden) är att jag generar ett nytt tal om värdet som genererats är mindre än nr1 (första talet använder skriver in). Jag har testat att googla lite men dom lösningarna jag hittar förstår jag inte riktigt så tänkte höra om någon här har någon simpel och effektiv lösning?

Om du subtraherar den undre gränsen blir problemet istället för att generera tal mellan nr1 och nr2 att generera tal mellan 0 och (nr2-nr1), och detta är ju nästan precis vad nextint gör...

Permalänk
Medlem
Skrivet av E_maN:

int low = 5; int high = 15; int roll = diceRoller.NextInt(high-low) + low;

skippa while satsen

edit: fixade ett misstag
Sättet det funkar är att räkna ut skillnaden mellan det höga och det låga talet, och randomiza mellan 0 och det, sen addera på det låga igen. skillnaden mellan 5 och 15 är det 10, så får vi ett tal, säg 2 kanske. Tillslut så adderar vi på det låga talet igen, 2+5 = 7. randomizar du fram 0 blir sluttalet 5, randomizar du 10 blir det 15. Simpelt va?

Ah, det där var väldigt simpelt. Tror jag har sett något liknande någon gång, men skrev nog "+high" istället varav jag inte trodde det funkade. Skulle kanske tänkt till lite

Tack

Skrivet av Elgot:

Om du subtraherar den undre gränsen blir problemet istället för att generera tal mellan nr1 och nr2 att generera tal mellan 0 och (nr2-nr1), och detta är ju nästan precis vad nextint gör...

Förstår inte riktigt vad du menar?

Permalänk
Medlem

#include "Dice.h" #include <iostream> #include <iomanip> #include <stdio.h> #include <stdlib.h> #include <time.h> using namespace std; int main(){ double min; double max; int recall; cout << "Input minimum interval point: "; cin >> min; do { cout << "Input maximum interval point: "; cin >> max; if(max == min || max < min) { cout << "Max can't be equal or lower than min." << endl; } }while(max == min || max < min); cout << "How many times should we try it?: "; cin >> recall; srand (time(NULL)); for(int i = 1; i < recall + 1; i++) { double range = max-min; double result = rand() * range / RAND_MAX + min; cout << i << " " << result << endl; } }

Gjorde ett litet exempel i C++, men du ser iallfall hur jag gjorde det.

Visa signatur

Prylhögen: Nexus 7, iPhone 5, MBPr 2013

Permalänk
Hedersmedlem
Skrivet av xawiahn:

Förstår inte riktigt vad du menar?

E_maN hann före; han gör likadant.