0

我想在我的 RPI3 中使用内置的硬件随机数生成器进行项目。目前我只能使用 /dev/hwrng 来保存二进制转储

dd if=/dev/hwrng of=data.bin bs=25 count=1

我的项目需要的是从随机源 (/dev/hwrng) 以 1 次读取/秒的频率读取 200 位长的数据块,并计算其中的 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__
4

1 回答 1

0

尝试运行以下代码

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
于 2018-10-28T05:06:24.760 回答