【问题标题】:I wrote a simple random number generator, how can I graph the distribution of the function I wrote?我写了一个简单的随机数生成器,如何绘制我写的函数的分布图?
【发布时间】:2016-03-08 01:17:46
【问题描述】:

这是我第一次编写随机数生成器,我只是想看看我能用随机公式做什么。

不过,我很好奇我的函数有多大的偏差以及函数的分布(在 1 到 9 之间)。 这是我不必要的长代码:

import time

class Random:
    """random generator"""

    def __init__(self):
        """ Random()-> create a random number generator with a random seed
        a seed is needed in order to generate random numbers"""
        self.seed = time.time()

    def random(self):
        """ Random.random() -> get a random number using a formula"""
        self.seed =(((int(self.seed)*129381249123+2019383)**0.74123)/517247) % 288371

    def get_ran_num(self):
        """ Random.get_ran_num() -> return a random integer from 1 thru 10"""
        self.random()
        return int(list(str(int(self.seed)))[3])


ranNum = Random()

如果有一些工具可以获取一个随机函数,然后运行它几千次,然后绘制它的分布图,那就太好了。

提前谢谢你

p/s:如何改进我的 RNG 并使其更加随机?

【问题讨论】:

标签: python random statistics


【解决方案1】:

如果你只是想要一个视觉表示,你可以很容易地使用

import matplotlib.pyplot as plt
# Random class here
ranNum = Random()
randNums = [ranNum.get_ran_num() for _ in range(100)]
nums = list(range(len(randNums)))
plt.plot(nums, randNums, 'ro')
plt.show()

这里是 100 个随机数:

但是,当我进入更高的范围时,我会收到 IndexError。您可能应该针对导致该问题的任何原因修复实际算法,但我在其上放置创可贴的方式是:

def get_ran_num(self):
    """ Random.get_ran_num() -> return a random integer from 1 thru 10"""
    retval = None
    while True:
        try:
            self.random()
            retval = int(list(str(int(self.seed)))[3])
            break
        except IndexError as e:
            continue
    return retval

这是一个 100,000 个随机数的图,非常好。没有比其他线条明显更密集的连续线条是您所追求的,但您需要进行更好的熵分析才能找出比快速视觉表示更有用的东西。在您的情况下,看起来 6 更受青睐。此外,它似乎经常重复。

【讨论】:

    【解决方案2】:

    我会尝试 random.rand 和 matplotlib。

    import numpy as np
    import matplotlib.pyplot as plt
    
    
    N = 50
    x = np.random.rand(N)
    y = np.random.rand(N)
    colors = np.random.rand(N)
    area = np.pi * (15 * np.random.rand(N))**2  # 0 to 15 point radiuses
    
    plt.scatter(x, y, s=area, c=colors, alpha=0.5)
    plt.show()
    

    这样的?

    编辑:您是否尝试生成伪随机数?无论如何,你需要一个移位寄存器的种子,所以在这方面,我不确定它是否完全随机。

    【讨论】:

      【解决方案3】:

      我更喜欢直方图来检查随机数生成器的分布均匀性。

      import numpy as np
      import matplotlib
      import matplotlib.pyplot as plt 
      myarr = np.random.randint(1000, size=100000)
      plt.hist(myarr, bins=40)
      plt.show()
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-07-24
        • 2020-10-27
        • 2014-05-26
        • 1970-01-01
        • 2013-01-30
        • 1970-01-01
        • 2012-03-12
        • 1970-01-01
        相关资源
        最近更新 更多