使用累积概率绘制

时间:2017-08-28 12:45:57

标签: python linux python-3.x

问题描述如下:根据元素“p”的不同概率从5×9二维矩阵中随机抽样,总共N = 15个非重复2D将选择索引值,概率“p”的二维数组已被硬编码,并且2D “p”数组的总和为1,但在许多情况下我的程序将落入死循环,在 elif 语句中,我反复检查问题,d最初认为这是随机数种子的问题。然后,每次创建一个新的随机数但仍然存在问题时,使用 time.time()重置随机种子, 所以我来问问题在哪里?为什么会这样?是什么原因?

import random
import time


def pick_pisotions(how_many):
    result_positions = []
    p = [[0, 0, 0, 0, 0, 0, 0, 0, 0],
         [0, 0, 0.09200879765395895, 0.10227272727272728, 0.0988514173998045, 0.010019550342130987, 0, 0, 0],
         [0, 0, 0.0024437927663734115, 0.17424242424242423, 0.44477028347996095, 0.07539100684261975, 0, 0, 0],
         [0, 0, 0, 0, 0, 0, 0, 0, 0],
         [0, 0, 0, 0, 0, 0, 0, 0, 0]]
    temp_position_list = []  # 2D positions, each item just like this format :(row, col)
    temp_p_list = []  # probability of be chosen of 2D array above
    for row in range(5):
        for col in range(9):
            temp_position_list.append((row, col))
            temp_p_list.append(p[row][col])
    print("sum =", sum(temp_p_list))

    seed_index = 0
    while True:  # choose N no-repeating positions, ()
        seed_index += 1
        # random.seed(time.time())
        random.seed(seed_index)
        length_of_result = len(result_positions)
        if length_of_result == how_many:  # enough
            return result_positions
        elif 0 <= length_of_result < how_many:  # not enough
            random_number = random.uniform(0, 1)
            cumulative_probability = 0.0
            for item_position, item_probability in zip(temp_position_list, temp_p_list):
                cumulative_probability += item_probability  #
                print(" test random_number = ", random_number)
                print(" test cumulative_probability = ", cumulative_probability)

                if random_number <= cumulative_probability:
                    result_positions.append(item_position)
                    result_positions = list(set(result_positions))  #
                    break
                else:
                    print("test random_number > cumulative_probability")
                    # pass
        else:
            print("error :pick_tiffs()")


pick_pisotions(15)

死循环总是发生在这里:

if random_number <= cumulative_probability:
    result_positions.append(item_position)
    result_positions = list(set(result_positions))  #
    break

我的母语不是英语,所以我的一些句子可能听起来很奇怪:) 并等待你的帮助〜

1 个答案:

答案 0 :(得分:0)

抱歉,我只是找到问题所在:

result_positions = list(set(result_positions))  #

此行删除重复项,我的所有2D&#34; p&#34;数组只有8个非零项,所以&#34; length_of_result&#34;将永远不会超过8的长度(如15) 我以前没有注意到这个问题。

为了获得高质量的随机数,我发现我可以使用 secrets.SystemRandom 版本3.6中的新功能。用于生成随机数的类操作系统提供的最高质量的资源。)

from random import SystemRandom
from random import Random

system_random = SystemRandom(Random())
random_number = system_random.random()