找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

查看: 3577|回复: 1

Python3使用累计概率抽签出现死循环的问题

1

主题

1

帖子

1

积分

贫民

积分
1
Chen 发表于 2017-8-28 14:32:00 | 显示全部楼层 |阅读模式
  1. import random
  2. import time


  3. def pick_pisotions(how_many):
  4.     result_positions = []
  5.     p = [[0, 0, 0, 0, 0, 0, 0, 0, 0],
  6.          [0, 0, 0.09200879765395895, 0.10227272727272728, 0.0988514173998045, 0.010019550342130987, 0, 0, 0],
  7.          [0, 0, 0.0024437927663734115, 0.17424242424242423, 0.44477028347996095, 0.07539100684261975, 0, 0, 0],
  8.          [0, 0, 0, 0, 0, 0, 0, 0, 0],
  9.          [0, 0, 0, 0, 0, 0, 0, 0, 0]]
  10.     temp_position_list = []  # tiff子图的二维坐标
  11.     temp_p_list = []  # tiff子图的被选中概率
  12.     for row in range(5):
  13.         for col in range(9):
  14.             temp_position_list.append((row, col))
  15.             temp_p_list.append(p[row][col])
  16.     print("sum =", sum(temp_p_list))

  17.     seed_index = 0
  18.     while True:  # 选取N个不重复数据
  19.         seed_index += 1
  20.         # random.seed(time.time())
  21.         random.seed(seed_index)
  22.         length_of_result = len(result_positions)
  23.         if length_of_result == how_many:  # 选够了
  24.             return result_positions
  25.         elif 0 <= length_of_result < how_many:  # 还不够
  26.             random_number = random.uniform(0, 1)
  27.             cumulative_probability = 0.0
  28.             for item_position, item_probability in zip(temp_position_list, temp_p_list):
  29.                 cumulative_probability += item_probability  #
  30.                 print("测试random_number = ", random_number)
  31.                 print("测试cumulative_probability = ", cumulative_probability)

  32.                 if random_number <= cumulative_probability:
  33.                     result_positions.append(item_position)
  34.                     result_positions = list(set(result_positions))  #
  35.                     break
  36.                 else:
  37.                     print("测试random_number > cumulative_probability")
  38.                     # pass
  39.         else:
  40.             print("错误:pick_tiffs()")


  41. pick_pisotions(15)
复制代码
问题描述如下:从5×9的二维矩阵中根据各自的不同概率p进行随机抽取N=15个不重复的下标值,概率p的二维数组已经进行硬编码,概率p的和为1,在一些情况下会陷入while的elif的语句内的死循环,期初拍错、修改了好几次,以为是随机数种子问题,但是尝试每次进行随机取值时候都重置随机数种子为random.seed(time.time())依旧会出现问题,经多次更正无果,来向大家请教一下问题出在哪里?并且为什么会这样?

回复

使用道具 举报

17

主题

85

帖子

85

积分

新手

积分
85
我是吃货 发表于 2018-7-17 18:47:24 | 显示全部楼层
你用while就有这种概率
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表