随机数分布测试

Processing --> Wiring
Wiring --> Arduino

这三个开源项目中Processing可以说是鼻祖,但是一直没有机会测试。国内用的也不算多,至少远不如Arduino。

看过知乎大牛们的随机数质量分析,其中一个简单的可视化工具引起了我的注意。它是把生成的随机数在2D平面中打印出来查看分布的质量。非常直观。虽然使用ImageMagick和其他工具箱也可以实现,但使用Processing实施起来比Python还要简单。


size(480, 480);
noSmooth();
background(0);
translate(0, 0);

// Draw white points
stroke(255);
for (int i=0; i<65535; i++){
    int x = int(random(0,480));
    int y = int(random(0,480));
    point(x,y);
}

saveFrame("random.png");

最后一句是把当前显示的Frame实现存盘。

随机数分布测试_第1张图片
random.png

Fig 1: 随机数输出图

从图1可以看到,Processing Java所引用的随机数质量还不错,没有明显的Pattern(重复的纹路或图案),如果出现Pattern,则意味着(伪)随机数质量不行。如果在循环中加一点儿延时,可以动态查看随机数的生成规律,即时域上的随机性。

接下来,我会将NUCLEO-F103RB ADC采样随机数通过串口发送给Processing,继续判断MCU ADC制造的随机数质量。

更新

采用Processing接受mbed传输的随机数会假死,可能我还是不太熟悉Processing的编程框架。我找到一个wxPython的例子,可能会在这个例子基础上改写。

#!/usr/bin/python

# points.py

import wx
import random

class Points(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, size=(480, 480))

        self.Bind(wx.EVT_PAINT, self.OnPaint)

        self.Centre()
        self.Show(True)

    def OnPaint(self, event):
        dc = wx.PaintDC(self)

        dc.SetPen(wx.Pen('BLACK'))

        for i in range(100000):
            w, h = self.GetSize()
            x = random.randint(1, w-1)
            y = random.randint(1, h-1)
            dc.DrawPoint(x, y)


app = wx.App()
Points(None, -1, 'Points')
app.MainLoop()

至少这个例子中采用的电脑RNG显示效果还行。

你可能感兴趣的:(随机数分布测试)