1. 程式人生 > >[Python]基於權重的隨機數2種實現方式

[Python]基於權重的隨機數2種實現方式

問題:

例如我們要選從不同省份選取一個號碼,每個省份的權重不一樣,直接選隨機數肯定是不行的了,就需要一個模型來解決這個問題。

簡化成下面的問題:

 字典的key代表是省份,value代表的是權重,我們現在需要一個函式,每次基於權重選擇一個省份出來

{"A":2, "B":2, "C":4, "D":10, "E": 20}

解決:

這是能想到和能看到的最多的版本,不知道還沒有更高效好用的演算法。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
#python2.7x
#random_weight.py 
#author: [email protected]
2014-10-11 ''' 每個元素都有權重,然後根據權重隨機取值 輸入 {"A":2, "B":2, "C":4, "D":10, "E": 20} 輸出一個值 ''' import random import collections as coll data = {"A":2, "B":2, "C":4, "D":6, "E": 11} #第一種 根據元素權重值 "A"*2 ..等,把每個元素取權重個元素放到一個數組中,然後最陣列下標取隨機數得到權重 def list_method(): all_data = [] for v, w in data.items(): temp = [] for i in range(w): temp.append(v) all_data.extend(temp) n = random.randint(0,len(all_data)-1) return all_data[n] #第二種 也是要計算出權重總和,取出一個隨機數,遍歷所有元素,把權重相加sum,當sum大於等於隨機數字的時候停止,取出當前的元組 def iter_method(): total = sum(data.values()) rad = random.randint(1,total) cur_total = 0 res = "" for k, v in data.items(): cur_total += v if rad<= cur_total: res = k break return res def test(method): dict_num = coll.defaultdict(int) for i in range(100): dict_num[eval(method)] += 1 for i,j in dict_num.items(): print i, j if __name__ == "__main__": test("list_method()") print "-"*50 test("iter_method()")

一次執行的結果

A 4
C 14
B 7
E 44
D 31
--------------------------------------------------
A 8
C 16
B 6
E 43
D 27


思路:

思路都很原始可以參考下面的連線,還有別的好方法一起交流!!

參考:

相關推薦

[Python]基於權重隨機數2實現方式

問題: 例如我們要選從不同省份選取一個號碼,每個省份的權重不一樣,直接選隨機數肯定是不行的了,就需要一個模型來解決這個問題。 簡化成下面的問題:  字典的key代表是省份,value代表的是權重,我們

【js】隨機色的2實現方式

+= function color var 隨機 隨機色 cti 2種 dom 隨機顏色的二種寫法 寫法一:var arr = ["0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "a", "b", "c", "d", "A

Laravel框架定時任務2實現方式示例

本文例項講述了Laravel框架定時任務2種實現方式。分享給大家供大家參考,具體如下: 第一種 1、生成一個commands檔案 > php artisan make:command test 2、開啟檔案進行修改 laravel\App\Console\Commands\

IOC初始化銷燬的2實現方式

IOC初始化銷燬的2種實現方式 1、bean內呼叫init-method 和destroy-method 2、通過註解實現@PostConstruct 和@PreDestroy -----------------------------bean內呼叫init-method 和destroy-method

c二維陣列初始化為0的2實現方式

 1 #include <stdio.h>   2 #include <stdlib.h>   3 #include <string.h>   4 int main()   5 {   6     //char a[2][4] ;   7

微信瀏覽器中打開提示的2實現方式

跳轉 遮罩 解決 推廣 ger 尋找 多說 默認 情況   之前公司有一個新的APP項目上線,我們在項目首頁做個二維碼,然後用戶用手機掃一掃就能下載了。但是微信的掃一掃之後下載不了。   上網查了一下,微信自帶的內置瀏覽器屏蔽了下載功能,所以才出現用微信掃一掃不能下載的情

微信跳轉瀏覽器提示_微信跳轉外部瀏覽器跳轉提示的2實現方式

上半年公司有一個新的APP專案上線,我們在專案首頁做個二維碼,然後使用者用手機掃一掃就能下載了。但是很多使

Python的幾實現方式

Python自身作為一門程式語言,它有多種實現。這裡的實現指的是符合Python語言規範的Python解釋程式以及標準庫等。這些實現雖然實現的是同一種語言,但是彼此之間,特別是與CPython之間還是有些差別的。 下面分別列出幾個主要的實現。 1.CPython:這是Python

okHttp的基本使用及2請求方式和各方法的同步非同步實現

一、效果 二、佈局 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto"

棧的兩實現方式(python實現)

    棧是一種後進先出(LIFO)的資料結構,在設計演算法時有十分廣泛的應用。對棧的操作是通過將元素壓入棧(放在棧頂),或是將棧頂元素彈出,都是對棧頂元素的操作。若要實現一個高效的棧,則要考慮到這兩種

【原創】redis庫存操作,分散式鎖的四實現方式[連載一]--基於zookeeper實現分散式鎖

一、背景 在電商系統中,庫存的概念一定是有的,例如配一些商品的庫存,做商品秒殺活動等,而由於庫存操作頻繁且要求原子性操作,所以絕大多數電商系統都用Redis來實現庫存的加減,最近公司專案做架構升級,以微服務的形式做分散式部署,對庫存的操作也單獨封裝為一個微服務,這樣在高併發情況下,加減庫存時,就會出現超賣等

【原創】redis庫存操作,分布式鎖的四實現方式[連載一]--基於zookeeper實現分布式鎖

zookeepe operation iat 並發 method logger 方案 nag 概念 一、背景 在電商系統中,庫存的概念一定是有的,例如配一些商品的庫存,做商品秒殺活動等,而由於庫存操作頻繁且要求原子性操作,所以絕大多數電商系統都用Redis來實現庫存的加減,

【原創】redis庫存操作,分散式鎖的四實現方式[連載二]--基於Redisson實現分散式鎖

一、redisson介紹 redisson實現了分散式和可擴充套件的java資料結構,支援的資料結構有:List, Set, Map, Queue, SortedSet, ConcureentMap, Lock, AtomicLong, CountDownLatch。並且是執行緒安全的,底層使用N

【連載】redis庫存操作,分散式鎖的四實現方式[三]--基於Redis watch機制實現分散式鎖

一、redis的事務介紹 1、 Redis保證一個事務中的所有命令要麼都執行,要麼都不執行。如果在傳送EXEC命令前客戶端斷線了,則Redis會清空事務佇列,事務中的所有命令都不會執行。而一旦客戶端傳送了EXEC命令,所有的命令就都會被執行,即使此後客戶端斷線也沒關係,因為Redis中已經記錄了所有要執行的

聚類分析(K-means 層次聚類和基於密度DBSCAN演算法三實現方式)

之前也做過聚類,只不過是用經典資料集,這次是拿的實際資料跑的結果,效果還可以,記錄一下實驗過程。 首先: 確保自己資料集是否都完整,不能有空值,最好也不要出現為0的值,會影響聚類的效果。 其次: 想好要用什麼演算法去做,K-means,層次聚類還是基於密

【劍指Offer學習】【面試題2實現Singleton 模式——七實現方式

題目:設計一個類,我們只能生成該類的一個例項 public class Test02 { /** * 單例模式,餓漢式,執行緒安全 */ public static class Singleton { privat

Python2實現檔案複製的方法

#coding:utf-8 # 方法1:使用read()和write()模擬實現檔案拷貝 # 建立檔案hello.txt src = file("hello.txt", "w") li = ["H

python 執行緒(建立2方式,守護程序,鎖,死鎖,遞迴鎖,GIL鎖,其他方式)

###############總結############ 執行緒建立的2種方式(重點) 程序:資源分配單位    執行緒:cpu執行單位(實體) 執行緒的建立和銷燬的開銷特別小 執行緒之間資源共享,是同一個程序中的資源共享,會涉及到安全問題,所以需要加鎖解決 鎖:犧牲

hadoop streaming reduce端join的python實現方式

實現student和course資料表的join操作,以學生編號(sno)為連線欄位 測試資料 student.txt檔案 #以一個空格分隔 #學生編號 姓名 #sno sname 01 lily 02 tom 03 jac

android實現事件監聽的2常用方式

1.使用內部匿名類: private Button button; @Override protected void onCreate(Bundle savedInstanceState) { sup