Java
Attention, c'est une question piège .....
La plupart des gens en Java utiliseront math.random () pour aider à générer cette séquence, mais ils seront confus car ils n'obtiendront que des résultats positifs! random()
renvoie une valeur décimale de 0 à 1 (à l'exclusion de 1 lui-même). Donc, vous devez jouer quelques tours pour vous assurer d'obtenir une bonne distribution des valeurs aléatoires sur toute la plage entière (positive et négative).
De plus, vous ne pouvez pas simplement multiplier Math.random()
et Integer.MAX_VALUE
parce que vous cela ne s'ajoutera jamais Integer.MAX_VALUE
au résultat! En outre, il serait logique de le faire math.rand() * (Integer.MAX_VALUE + 1)
pour obtenir une distribution complète, mais, bien sûr, cela ne fonctionne pas car cela Integer.MAX_VALUE + 1
va déborder et devenir Integer.MIN_VALUE
! Donc, malheureusement, la meilleure solution est de recourir à une manipulation bit à bit des données ...
Donc, voici une séquence complète pour générer des «n» valeurs aléatoires dans la plage Integer.MIN_VALUE
de Integer.MAX_VALUE
(Inclus des deux extrêmes (qui est la partie 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;
}
Cela produit une sortie comme:
[-368095066, -1128405482, 1537924507, -1864071334, -130039258, 2020328364, -2028717867, 1796954379, 276857934, -1378521391]
Bien sûr, ce qui précède est une réponse BS complète. Il ne produit pas une bonne description, et il «cache» un bogue grave ( ^=
devrait l'être |=
). il cache également un bogue moins grave (la priorité de commande-pf signifie que nous ne multiplions pas du tout par une valeur première!) L'utilisation de mots fantaisistes, de nombres premiers et de nombreux commentaires n'est pas une raison pour faire confiance au code ... Bien sûr, si vous voulez faire ce qui précède, vous devez simplement utiliserjava.util.Random.nextInt()