Класс Java Random
использует внутренние часы процессора (насколько я знаю).Точно так же можно использовать информацию ОЗУ как источник случайности.Просто откройте диспетчер задач Windows, вкладку «Производительность» и посмотрите на физическую память - доступно: она постоянно меняется;в большинстве случаев значение обновляется примерно каждую секунду, только в редких случаях значение остается постоянным в течение нескольких секунд. Другими значениями, которые изменяются все чаще, являются системные дескрипторы и потоки , но я не нашел команду cmd
, чтобы получить их значение.Поэтому в этом примере я буду использовать Доступную физическую память в качестве источника случайности.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public String getAvailablePhysicalMemoryAsString() throws IOException
{
Process p = Runtime.getRuntime().exec("cmd /C systeminfo | find \"Available Physical Memory\"");
BufferedReader in =
new BufferedReader(new InputStreamReader(p.getInputStream()));
return in.readLine();
}
public int getAvailablePhysicalMemoryValue() throws IOException
{
String text = getAvailablePhysicalMemoryAsString();
int begin = text.indexOf(":")+1;
int end = text.lastIndexOf("MB");
String value = text.substring(begin, end).trim();
int intValue = Integer.parseInt(value);
System.out.println("available physical memory in MB = "+intValue);
return intValue;
}
public boolean getRandomBoolean() throws IOException
{
int randomInt = getAvailablePhysicalMemoryValue();
return (randomInt%2==1);
}
public static void main(String args[]) throws IOException
{
Main m = new Main();
while(true)
{
System.out.println(m.getRandomBoolean());
}
}
}
Как вы можете видеть, основная часть выполняет команду cmd systeminfo
, сRuntime.getRuntime().exec()
.
Ради краткости я опустил операторы try-catch.Я запускал эту программу несколько раз, и никаких ошибок не возникало - всегда есть строка «Доступная физическая память» в выходных данных команды cmd.
Возможные недостатки:
- Есть некоторая задержка в выполнении этой программы.Обратите внимание, что в функции
main()
внутри цикла while(true)
отсутствует Thread.sleep()
, и все же вывод выводится на консоль только раз в секунду или около того. - Доступная память может бытьконстанта для вновь открытого сеанса ОС - пожалуйста, проверьте.У меня запущено всего несколько программ, и значение меняется каждую секунду.Я предполагаю, что если вы запускаете эту программу в среде сервера, получение разных значений для каждого вызова не должно быть проблемой.