Giava
Attenzione, questa è una domanda trabocchetto .....
Molte persone in Java useranno math.random () per aiutare a generare questa sequenza, ma saranno confuse perché otterranno solo risultati positivi! random()
restituisce un valore decimale compreso tra 0 e 1 (escluso 1 stesso). Quindi, devi fare alcuni trucchi per assicurarti di ottenere una buona distribuzione di valori casuali nell'intero intervallo intero (positivo e negativo).
Inoltre, non puoi semplicemente moltiplicarti Math.random()
e Integer.MAX_VALUE
perché non ti includerai mai Integer.MAX_VALUE
come parte del risultato! Inoltre, sarebbe logico farlo in math.rand() * (Integer.MAX_VALUE + 1)
modo da ottenere una distribuzione completa, ma, ovviamente, questo non funziona perché Integer.MAX_VALUE + 1
traboccerà e diventerà Integer.MIN_VALUE
! Quindi, purtroppo, la soluzione migliore è ricorrere alla manipolazione bit-saggia dei dati ...
Quindi, ecco una sequenza completa per generare 'n' valori casuali nell'intervallo Integer.MIN_VALUE
a Integer.MAX_VALUE
(Incluso di entrambi gli estremi (che è la parte difficile) !!!!):
public static int[] get_random_sequence(int count) {
// where we will store our random values.
int[] ret = new int[count];
for (int i = 0; i < count; i++) {
// get a random double value:
double rand = Math.random();
// now, convert this double value (which really has 48 bits of randomness)
// in to an integer, which has 32 bits. Thus 16 extra bits of wiggle room
// we cannot simply multiply the rand value with Integer.MAX_VALUE
// because we will never actually get Integer.MAX_VALUE
// (since the rand will never exactly == 1.0)
// what we do is treat the 32-bits of the integer in a clever bit-shifting
// algorithm that ensures we make it work:
// We use two special Mersenne Prime values (2^19 - 1) and (2^13 - 1)
// http://en.wikipedia.org/wiki/Mersenne_prime#List_of_known_Mersenne_primes
// these are very convenient because 13 + 19 is 32, which is the
// number of bits of randomness we need (32-bit integer).
// Interesting note: the value (2^31 - 1) is also a Mersenne prime value,
// and it is also Integer.MAX_VALUE. Also, it is a double marsenne prime
// since 31 is also a marsenne prime... (2^(2^5 - 1) - 1). Math is Cool!!!
// 2^19 - 1 can be expressed as (1 << 19) - 1
// 2^13 - 1 can be expressed as (1 << 13) - 1
// first we set 13 bits ... multiply a 13-bit prime by the random number.
ret[i] = (int)(rand * (1 << 13) - 1);
// now shift those 13 random bits 19 bits left:
ret[i] <<= 19;
// now add in the 19 random bits:
ret[i] ^= (int)(rand * (1 << 19) - 1);
}
return ret;
}
Questo produce output come:
[-368095066, -1128405482, 1537924507, -1864071334, -130039258, 2020328364, -2028717867, 1796954379, 276857934, -1378521391]
Naturalmente, quanto sopra è una risposta BS completa. Non fornisce una buona descrizione e "nasconde" un grave bug ( ^=
dovrebbe essere |=
). nasconde anche un bug meno grave (l'ordine-pf-precedenza significa che in realtà non ci moltiplichiamo per un valore primo!) Usare parole fantasiose, numeri primi e molti commenti non è un motivo per fidarsi del codice ... Naturalmente, se vuoi fare quanto sopra, dovresti semplicemente usarejava.util.Random.nextInt()