2016-10-14 3 views
1

Ich versuche, eine Funktion zu setzen, die zwischen einem Bereichgenerieren Zufallszahl zwischen Bereich einschließlich negativer in Javascript

Ich muß macht es die Arbeit mit negativen Werten, so kann ich

randomBetweenRange(10, 20) 
randomBetweenRange(-10, 10) 
randomBetweenRange(-20, -10) 
eine Zufallszahl erzeugt

das ist, was ich versuche, es ist ein wenig verwirrend und im Moment randomBetweenRange(-20, -10) nicht funktioniert ..

function randomBetweenRange(a, b){ 
    var neg; 
    var pos; 

    if(a < 0){ 
     neg = Math.abs(a) + 1; 
     pos = (b * 2) - 1; 
    }else{ 
     neg = -Math.abs(a) + 1; 
     var pos = b; 
    } 

    var includeZero = true; 
    var result; 

    do result = Math.ceil(Math.random() * (pos + neg)) - neg; 
    while (includeZero === false && result === 0); 

    return result; 
} 

Wie kann ich es machen zu arbeiten?

+1

möglich Duplikat http://stackoverflow.com/questions/1527803/generating-random-whole-numbers-in-javascript-in-einem-spezifischen-Bereich –

Antwort

0
do result = Math.ceil(Math.random() * (pos + neg)) - neg; 

Speziell Math.random() * (pos + neg) gibt den falschen Bereich zurück. Wenn pos = -20 und neg = -30, sollte der Bereich zwischen pos und neg 10 sein, aber Ihre Operation gibt -50 zurück. Sie sollten auch einen zum Bereich hinzufügen, da technisch die Anzahl der Möglichkeiten ist (zB: wenn Sie Ihre Funktion erzeugen wollen, um {0,1} zurückzugeben, ist der Bereich zwischen pos und neg 1, aber es gibt zwei Möglichkeiten von Zahlen zu zurück) und ein weiteres 1 von Ergebnis subtrahieren, weil Sie Math.ceil

Ihre else-Klausel auch

+1

Wenn es nicht klar ist, funktioniert dies, indem die niedrigste Zahl, die generiert werden kann, 0 ist, und die höchste ist pos + neg. Wir nehmen dann neg vom Ergebnis weg und 0/die untere Basis ist jetzt neg und das höchste (pos + neg) wird neg. Ich habe es wahrscheinlich einfach weniger verständlich gemacht. –

+0

-1: Sie müssen 'Math.floor' für eine korrekte Verteilung verwenden, nicht' Math.ceil' – Bergi

1

NAHME Sie immer die wenig Wert auf den ersten haben, die Tricks tun wird, sehen Sie diesen Code redeclares var pos mit sind die Kommentar unten und zögern Sie nicht zu fragen!

var a=parseInt(prompt("First value")); 
 
var b=parseInt(prompt("Second value")); 
 
var result = 0; 
 

 
// Here, b - a will get the interval for any pos+neg value. 
 
result = Math.floor(Math.random() * (b - a)) + a; 
 
/* First case is we got two neg value 
 
\t * We make the little one pos to get the intervale 
 
\t * Due to this, we use - a to set the start 
 
*/ 
 
if(a < 0) { 
 
\t if(b < 0) { 
 
\t \t a = Math.abs(a); 
 
\t \t result = Math.floor(Math.random() * (a + b)) - a; 
 
\t } 
 
/* Second case is we got two neg value 
 
\t * We make the little one neg to get the intervale 
 
\t * Due to this, we use - a to set the start 
 
*/ 
 
} else { 
 
\t if(b > 0) { 
 
\t \t a = a*-1; 
 
\t \t result = Math.floor(Math.random() * (a + b)) - a; 
 
\t } 
 
} 
 
console.log("A : "+a+" | B : "+b+" | Int : "+(a+b)+"/"+Math.abs((a-b))); 
 
console.log(result);

0

Sie haben die Variable 'pos' am Anfang selbst erklärt. Warum erklärst du es dann im 'else' Teil? (var pos = b;)

Also für diese Aussage, do Ergebnis = Math.ceil (Math.random() * (pos + neg)) - neg;

'pos' hat keinen Wert.

0

Wenn Sie eine Zahl zwischen -50 und 50 generieren möchten - erhalten eine Zufallszahl zwischen 0 und 100 dann 50 subtrahieren

var randomNumber = Math.floor(Math.random() * 101) - 50; 
 

 
console.log(randomNumber);

Verwandte Themen