Возможность генерировать истинные случайные числа зависит от энтропии в вашей системе. Некоторые утверждают, что это может быть гарантировано честным броском костей . Другие считают, что замена 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
|
92 221 45 48 236 183 39 193 33 84 |
Не верь этому? Попробуйте это в своем приложении! Испытывая это в своем заявлении, вы соглашаетесь со следующими условиями лицензирования :
Если это не требуется действующим законодательством или не согласовано в письменной форме, программное обеспечение, распространяемое по лицензии, распространяется на условиях «КАК ЕСТЬ», БЕЗ ГАРАНТИЙ ИЛИ УСЛОВИЙ ЛЮБОГО РОДА, явных или подразумеваемых.