【问题标题】:Randomness test of my own Python RNG [closed]我自己的 Python RNG 的随机性测试 [关闭]
【发布时间】:2014-10-22 08:03:44
【问题描述】:

这是给我的一项特殊任务,我无法理解并且感到困惑。 我有以下随机数生成器类。

rng.py

#!/usr/bin/env python

class rngA():   
    def __init__(self, seed=0): self.state = seed
    def setSeed(self, seed): self.state = seed
    def rand(self): return 1.0*self.next()/(1<<32)
    def current(self): return self.state    
    def next(self):
        self.state = (69069 * self.state + 12345) & 0xFFFFFFFF
        return self.state

class rngB():   
    def __init__(self, seed=1): self.state = seed
    def setSeed(self, seed): self.state = seed
    def rand(self): return 1.0*self.next()/(1<<31)
    def current(self): return self.state    
    def next(self):
        self.state = (65539 * self.state + 4294967296) & 0x7FFFFFFF
        return self.state

class rngC():   
    def __init__(self, seed=1): self.state = seed
    def setSeed(self, seed): self.state = seed
    def rand(self): return 1.0*self.next()/(1<<12)
    def current(self): return self.state    
    def next(self):
        self.state = ((((16339 * self.state>>4 + 1) & 0xFF) + 4294967296) & 0x7FFFFFFF)<<4
        return self.state

class rngD():   
    def __init__(self, seed=1): 
        self.state = self.store = seed
    def setSeed(self, seed): self.state = seed
    def rand(self): return 1.0*self.next()/(1<<32)
    def current(self): return self.state    
    def next(self):
        self.store = self.state
        self.state = (69069 * self.state + 12345) & 0xFFFFFFFF
        self.state = int(.8*self.state+0.2*self.store)
        return self.state

class rngE():   
    def __init__(self, seed=12345): self.state = seed
    def setSeed(self, seed): self.state = seed
    def rand(self): return 1.0*self.next()/(1<<31)
    def current(self): return self.state    
    def next(self):
        self.state = (397204094 * self.state ) & 0x7FFFFFFF
        return self.state

如何测试 RNG 的随机性。

那里有一些测试,比如

1.Frequency test
2.Runs test
3.Autocorrelation test
4.Gap test
5.Poker test

但我无法理解如何使用 python 来做到这一点。请帮我一条出路,我可以完成我的任务。

谢谢

【问题讨论】:

  • 你能先解释一下随机性吗?
  • 随机性是指是否生成随机数,没有重复的数字。像那样@m170897017
  • @ShantanuBanerjee 你的问题是不是太宽泛了?我将从第一部分开始,频率测试,使用我的教科书和课堂笔记。如果我不是太生疏,那就是对大量结果进行分箱并计算一些样本统计数据,以便与理论上随机分布的样本的统计规定进行比较,但这是一项任务,你不应该比你更了解这些东西吗?我?一旦你知道要做什么,就回来提出一个关于编码的新的、具体的问题,你会找到你需要的所有帮助。冲洗,重复其他测试。谢谢。
  • @ShantanuBanerjee 如果我的回答对您有帮助,请接受。 :)

标签: python random scipy


【解决方案1】:

这样的简单示例:

#!/usr/bin/env python
#-*- coding:utf-8 -*-

def test_function():

    test_times = 10000

    a_object = rngA()
    b_object = rngB()
    c_object = rngC()
    d_object = rngD()

    a_res = []
    b_res = []
    c_res = []
    d_res = []

    for i in xrange(test_times):
        a_res.append(a_object.rand)
        b_res.append(b_object.rand)
        c_res.append(c_object.rand)
        d_res.append(d_object.rand)

    test_res = a_res + b_res + c_res + d_res

    if len(set(test_res)) != test_times*4:
        print 'test fails, there is recepition!!'
    else:
        print 'test passes, they are all random!!'

【讨论】:

  • 感谢您的回复。我已经运行了它,它显示test fails, there is recepition!!。你能简单解释一下逻辑吗?我可以使用 Kolmogorov-Smirnov 测试来做这件事吗? @m170897017
  • @ShantanuBanerjee 我重复创建所有四个随机对象 10000 次。然后将所有这 40000 个对象列一个列表。然后使用 set() 删除列表中的重复对象并计算其长度。如果长度小于 40000,则表示有接收。如果长度等于40000,则表示列表中没有接收。
猜你喜欢
  • 2013-02-27
  • 2011-11-30
  • 1970-01-01
  • 1970-01-01
  • 2015-05-08
  • 2013-05-16
  • 2014-12-31
  • 1970-01-01
  • 2019-05-27
相关资源
最近更新 更多