Скрипт Linux с использованием аппаратного (True) генератора случайных чисел
Я хотел бы использовать встроенный аппаратный генератор случайных чисел в моем RPI3 для проекта. В настоящее время я могу использовать только /dev/hwrng для сохранения бинарных дампов с
dd if=/dev/hwrng of=data.bin bs=25 count=1
Что мне нужно для моего проекта - это прочитать 200-битные фрагменты данных из случайного источника (/dev/hwrng) с частотой 1 чтение / секунда, посчитать в нем 1 и записать результат в виде десятичного числа в текстовый файл с отметка времени, вот так:
datetime, value
11/20/2018 12:48:09, 105
11/20/2018 12:48:10, 103
11/20/2018 12:48:11, 97
Десятичное число всегда должно быть близко к 100, поскольку это случайный источник данных, и ожидаемое число 1 и 0 должно быть одинаковым. Любая помощь приветствуется....
Я придумал Perl-скрипт, который близок к тому, что я не хочу, поэтому позвольте мне поделиться им. Я уверен, что это можно сделать намного чище, хотя...
#!/usr/bin/perl
use strict;
use warnings;
use DateTime;
my @bitcounts = (
0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4, 1, 2, 2, 3, 2, 3,
3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 1, 2, 2, 3, 2, 3, 3, 4, 2, 3, 3, 4,
3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 1, 2,
2, 3, 2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5,
3, 4, 4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5,
5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 1, 2, 2, 3,
2, 3, 3, 4, 2, 3, 3, 4, 3, 4, 4, 5, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4,
4, 5, 4, 5, 5, 6, 2, 3, 3, 4, 3, 4, 4, 5, 3, 4, 4, 5, 4, 5, 5, 6,
3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 2, 3, 3, 4, 3, 4,
4, 5, 3, 4, 4, 5, 4, 5, 5, 6, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6,
5, 6, 6, 7, 3, 4, 4, 5, 4, 5, 5, 6, 4, 5, 5, 6, 5, 6, 6, 7, 4, 5,
5, 6, 5, 6, 6, 7, 5, 6, 6, 7, 6, 7, 7, 8
);
for (my $i=0; $i <= 10; $i++) {
system("dd if=/dev/hwrng of=temprnd.bin bs=25 count=1 status=none");
my $filename = 'temprnd.bin';
open(my $fh, '<', $filename) or die "$!";
binmode $fh;
my $count = 0;
my $byte = 0;
while ( read $fh, $byte, 1 ) {
$count += $bitcounts[ord($byte)];
}
my $dt = DateTime->now;
print join ',', $dt->ymd, $dt->hms,"$count\n";
system("rm temprnd.bin");
sleep 1;
}
__END__
1 ответ
Попробуйте запустить следующий код
for ((n=0; n<200; ++n)); do echo $(date '+%m/%d/%Y %H:%M:%S'), $(od -vAn -N1 -tu1 < /dev/hwrng); sleep 1; done
Если вы хотите сохранить его в файл, в конце добавьте простое перенаправление> somefile
Обновление по новому запросу, попробуйте запустить следующий код
for ((n=0; n<10; ++n)); do
count=0
for ((s=0; s<200; ++s)); do
if (( $(od -vAn -N1 -tu1 < /dev/hwrng) > 127 )); then ((++count)); fi
done
echo $(date '+%m/%d/%Y %H:%M:%S'), $count
sleep 1
done