Java
Achtung, das ist eine Trickfrage .....
Die meisten Java-Benutzer verwenden math.random (), um diese Sequenz zu generieren, aber sie werden verwirrt, weil sie nur positive Ergebnisse erhalten! random()
gibt einen Dezimalwert von 0 bis 1 zurück (ohne 1 selbst). Sie müssen also einige Streiche spielen, um eine gute Verteilung der Zufallswerte über den gesamten Integer-Bereich (positiv und negativ) sicherzustellen.
Sie können auch nicht einfach multiplizieren Math.random()
und Integer.MAX_VALUE
da Sie dies nie Integer.MAX_VALUE
als Teil des Ergebnisses einschließen ! Es wäre auch logisch, dies zu tun, math.rand() * (Integer.MAX_VALUE + 1)
damit Sie eine vollständige Verteilung erhalten, aber dies funktioniert natürlich nicht, da Integer.MAX_VALUE + 1
es zu einem Überlauf kommt und wirdInteger.MIN_VALUE
! Die beste Lösung ist leider die bitweise Manipulation der Daten ...
Hier ist also eine vollständige Sequenz zum Erzeugen von 'n' Zufallswerten im Bereich Integer.MIN_VALUE
bis Integer.MAX_VALUE
(einschließlich beider Extreme (was der schwierige Teil ist) !!!!):
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;
}
Dies erzeugt eine Ausgabe wie:
[-368095066, -1128405482, 1537924507, -1864071334, -130039258, 2020328364, -2028717867, 1796954379, 276857934, -1378521391]
Natürlich ist das oben Genannte eine vollständige BS-Antwort. Es liefert keine gute Beschreibung und 'verbirgt' einen schweren Fehler (^=
sollte es sein |=
). es verbirgt sich auch ein weniger schwerwiegender Fehler (die Reihenfolge bedeutet, dass wir überhaupt nicht mit einem Primwert multiplizieren!) Die Verwendung ausgefallener Wörter, Primzahlen und vieler Kommentare ist kein Grund, dem Code zu vertrauen ... Natürlich, wenn Sie das oben genannte tun möchten, sollten Sie nur verwendenjava.util.Random.nextInt()