Jawa
Hati-hati, ini pertanyaan jebakan .....
Sebagian besar orang di Jawa akan menggunakan math.random () untuk membantu menghasilkan urutan ini, tetapi mereka akan menjadi bingung karena mereka hanya akan mendapatkan hasil positif! random()
mengembalikan nilai desimal dari 0 ke 1 (tidak termasuk 1 itu sendiri). Jadi, Anda harus memainkan beberapa trik untuk memastikan Anda mendapatkan distribusi nilai acak yang baik dari seluruh rentang integer (positif dan negatif).
Anda juga tidak bisa melipatgandakan Math.random()
dan Integer.MAX_VALUE
karena Anda ini tidak akan pernah memasukkan Integer.MAX_VALUE
dirinya sebagai bagian dari hasilnya! Juga, akan logis untuk melakukannya math.rand() * (Integer.MAX_VALUE + 1)
sehingga Anda mendapatkan distribusi penuh, tetapi, tentu saja, ini tidak berfungsi karena Integer.MAX_VALUE + 1
akan meluap, dan menjadiInteger.MIN_VALUE
! Jadi, sayangnya, solusi terbaik adalah menggunakan manipulasi data sedikit-bijaksana ...
Jadi, berikut ini adalah urutan lengkap untuk menghasilkan nilai acak 'n' dalam rentang Integer.MIN_VALUE
ke Integer.MAX_VALUE
(Termasuk kedua ekstrem (yang merupakan bagian sulit) !!!!):
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;
}
Ini menghasilkan output seperti:
[-368095066, -1128405482, 1537924507, -1864071334, -130039258, 2020328364, -2028717867, 1796954379, 276857934, -1378521391]
Tentu saja, jawaban di atas adalah jawaban BS lengkap. Itu tidak menghasilkan deskripsi yang baik, dan 'menyembunyikan' bug parah ( ^=
seharusnya |=
). itu juga menyembunyikan bug yang tidak terlalu parah (urutan-pf-diutamakan berarti kita tidak benar-benar mengalikan nilai prima sama sekali!) Menggunakan kata-kata mewah, bilangan prima, dan banyak komentar bukan alasan untuk mempercayai kode ... Tentu saja, jika Anda ingin melakukan hal di atas, sebaiknya gunakan sajajava.util.Random.nextInt()