Java
Coi chừng, đây là một câu hỏi mẹo .....
Hầu hết mọi người trong Java sẽ sử dụng math.random () để giúp tạo ra chuỗi này, nhưng họ sẽ bị lẫn lộn vì họ sẽ chỉ nhận được kết quả tích cực! random()
trả về giá trị thập phân từ 0 đến 1 (không bao gồm 1 chính nó). Vì vậy, bạn phải chơi một số thủ thuật để đảm bảo bạn có được sự phân phối tốt các giá trị ngẫu nhiên từ toàn bộ phạm vi số nguyên (dương và âm).
Ngoài ra, bạn không thể đơn giản nhân lên Math.random()
và Integer.MAX_VALUE
bởi vì bạn điều này sẽ không bao giờ bao gồm Integer.MAX_VALUE
chính nó như là một phần của kết quả! Ngoài ra, sẽ là hợp lý khi làm math.rand() * (Integer.MAX_VALUE + 1)
như vậy để bạn có được một bản phân phối đầy đủ, nhưng, tất nhiên, điều này không hoạt động vì Integer.MAX_VALUE + 1
sẽ tràn ra và trở thành Integer.MIN_VALUE
! Vì vậy, thật không may, giải pháp tốt nhất là sử dụng các thao tác dữ liệu bit khôn ngoan ...
Vì vậy, đây là một chuỗi hoàn chỉnh để tạo các giá trị ngẫu nhiên trong phạm vi Integer.MIN_VALUE
thành Integer.MAX_VALUE
(Bao gồm cả hai thái cực (là phần khó) !!!!):
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;
}
Điều này tạo ra đầu ra như:
[-368095066, -1128405482, 1537924507, -1864071334, -130039258, 2020328364, -2028717867, 1796954379, 276857934, -1378521391]
Tất nhiên, trên đây là một câu trả lời hoàn chỉnh của BS. Nó không tạo ra một mô tả hay và nó 'che giấu' một lỗi nghiêm trọng ( ^=
nên có |=
). nó cũng che giấu một lỗi ít nghiêm trọng hơn (ưu tiên thứ tự pf có nghĩa là chúng ta thực sự không nhân với một giá trị nguyên tố nào cả!) Sử dụng các từ ưa thích, số nguyên tố và rất nhiều bình luận không phải là lý do để tin vào mã ... Tất nhiên, nếu bạn muốn làm như trên, bạn chỉ nên sử dụngjava.util.Random.nextInt()