Возможность генерировать истинные случайные числа зависит от энтропии в вашей системе. Некоторые утверждают, что это может быть гарантировано честным броском костей . Другие считают, что замена java.math.Random.nextInt () метода OpenJDK на это тело поможет:
|
1
2
3
|
public int nextInt() { return 14;} |
Но это абсурд. Мы все знаем, что лучший способ добавить истинную энтропию в JVM — переписать java.lang.Integer.IntegerCache при запуске вашей JVM. Вот код:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
import java.lang.reflect.Field;import java.util.Random;public class Entropy { public static void main(String[] args) throws Exception { // Extract the IntegerCache through reflection Class<?> clazz = Class.forName( "java.lang.Integer$IntegerCache"); Field field = clazz.getDeclaredField("cache"); field.setAccessible(true); Integer[] cache = (Integer[]) field.get(clazz); // Rewrite the Integer cache for (int i = 0; i < cache.length; i++) { cache[i] = new Integer( new Random().nextInt(cache.length)); } // Prove randomness for (int i = 0; i < 10; i++) { System.out.println((Integer) i); } }} |
Когда я в последний раз пытался, выше напечатано
|
01
02
03
04
05
06
07
08
09
10
|
922214548236183391933384 |
Не верь этому? Попробуйте это в своем приложении! Испытывая это в своем заявлении, вы соглашаетесь со следующими условиями лицензирования :
Если это не требуется действующим законодательством или не согласовано в письменной форме, программное обеспечение, распространяемое по лицензии, распространяется на условиях «КАК ЕСТЬ», БЕЗ ГАРАНТИЙ ИЛИ УСЛОВИЙ ЛЮБОГО РОДА, явных или подразумеваемых.