2011-12-23 11 views

risposta

92

Non utilizzare la funzione esistente: è sufficiente chiamare il numero Math.random(). Se < 0.5 quindi -1, altrimenti 1:

var plusOrMinus = Math.random() < 0.5 ? -1 : 1; 
+4

funziona perfettamente, divertente non ho potuto trovare una risposta ovunque online. –

+1

Bella soluzione elegante, grazie –

9

Solo per il gusto di farlo:

var plusOrMinus = [-1,1][Math.random()*2|0]; 

o

var plusOrMinus = Math.random()*2|0 || -1; 

ma utilizzare ciò che si pensa sarà mantenibile.

+1

Da un lato, dovrei dire che c'è qualcosa da dire per la leggibilità. D'altra parte, complimenti per la rasatura di 3 caratteri fuori dalla mia risposta (anche se potrei obiettare che tutti e 3 i caratteri sono spazi bianchi non necessari). Il mio è più corto di 1 carattere se si elimina anche '0' da' 0.5'. :-) – ziesemer

+0

Sì, solo per divertimento. :-) – RobG

+0

questo è un pezzo di codice! – egidiocs

35

Sono sempre stato un fan di

Math.round(Math.random()) * 2 - 1 

quanto appena sorta di senso.

  • Math.round(Math.random()) vi darà 0 o 1

  • moltiplicando il risultato per 2 vi darà 0 o 2

  • E poi sottraendo 1 ti dà -1 o 1.

Intuitivo!

+0

@RobG - sei corretto, signore – majman

+0

Secondo me questo è un migliore "random" - o + creatore. La risposta selezionata non funziona per me, perché cosa succede se voglio un numero inferiore a 4 che non sia negativo? Questa è solo una soluzione tutt'intorno migliore. – Brendan

3

Ci sono molti modi per farlo, come mostrano le risposte precedenti.

Il più veloce essere combinazione di Math.round() e Math.random:

// random_sign = -1 + 2 x (0 or 1); 
random_sign = -1 + Math.round(Math.random()) * 2; 

È inoltre possibile utilizzare Math.cos() (which is also fast):

// cos(0) = 1 
// cos(PI) = -1 
// random_sign = cos(PI x (0 or 1)); 
random_sign = Math.cos(Math.PI * Math.round(Math.random())); 
3

Perché non si tenta :

(Math.random() - 0.5) * 2 

50% di possibilità di avere un valore negativo con l'ulteriore vantaggio di avere ancora un numero casuale generato.

O se realmente bisogno di un -1/1:

Math.ceil((Math.random() - 0.5) * 2) < 1 ? -1 : 1; 
Problemi correlati