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实现存盘。
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显示效果还行。