问题描述如下:根据元素“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
我的母语不是英语,所以我的一些句子可能听起来很奇怪:) 并等待你的帮助〜
答案 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()