random(隨機數)


前言

該模塊實現了各種分布的偽隨機數生成器。我們可以用該模塊生成隨機數或者字符串。

常用方法

  • random.random(),返回0~1之間的隨機浮點數據。
import random
print(random.random())  # 0.4390372412981508
  • random.sample(Population, k),從指定范圍內(Population)返回指定個數(k)的不重復的元素。
import random
print(random.sample(range(100), 5))  # [19, 8, 96, 70, 88]
print(random.sample([1, 2, 3, 4, 5, 6], 3))  # [3, 1, 5]
print(random.sample(['a', 'b', 'c', 'd', 'e'], 3))  # ['a', 'd', 'c']
print(random.sample('abcde', 3))  # ['a', 'c', 'e']
print(random.sample({'a': 1, 'b': 2, 'c': 3}, 2))   # TypeError: Population must be a sequence or set. For dicts, use list(d).
print(random.sample((1, 2, 3, 4), 2))  # [1, 3]
  • random.randint(a, b),返回a~b中的整數,包括a和b本身。
import random
print(random.randint(1, 10))  # 1
print(random.randint(1, 1))  # 1
print(random.randint(1.1, 10.5))   # ValueError: non-integer arg 1 for randrange()
  • random.choice(seq),從seq中返回其中一個值。
import random
print(random.choice(range(100)))  # 1
  • random.randrange(),從start ~ stop之間(包含本身)返回一個隨機數,並可以指定步長step
import random
print(random.randrange(start=1, stop=4, step=1))  # 會在1,2,3,4中隨機返回一個
print(random.randrange(start=1, stop=4, step=2))  # 從每隔兩個中隨機會返回1個隨機數,也就是說從1,3中返回
  • random.shuffle(seq),打亂指定的seq。需要注意的是該方法沒有返回值,只是將在原seq的序列順序打亂。
import random
l = list(range(1, 20))
random.shuffle(l)
print(l)  # [19, 11, 12, 17, 6, 3, 9, 5, 18, 13, 2, 16, 10, 15, 1, 4, 7, 8, 14]

應用示例

驗證碼

生成一個6位隨機驗證碼(包含數字和大小寫字母)。

import random
def verification_code():
    code = ''
    for i in range(6):
        num = random.randint(0, 9)  # 隨機整數
        alf_big = chr(random.randint(65, 90))   # 隨機大寫的A-Z
        alf_small = chr(random.randint(97, 122))    # 隨機小的a-z
        add = random.choice([num, alf_big, alf_small])
        code += str(add)
    return code
print(verification_code())     # P452t4

發紅包

發紅包、指定金額和個數,並隨機分配紅包金額。

  • 發紅包1.0版 200塊錢 10個紅包
import random
r = random.sample(range(1, 200), 9)
r.sort()
r.insert(0, 0)
r.append(200)
# print(r) # [0, 34, 60, 80, 88, 97, 101, 125, 171, 180, 200]
l = []
for i in range(10):
    l.append((r[i + 1] - r[i]))
print(l, abs(sum(l)))  # [34, 26, 20, 8, 9, 4, 24, 46, 9, 20] 200
  • 紅包2.0版
import random
def red_lv1(money, num):
    r = random.sample(range(1, money * 100), num - 1)
    r.sort()
    r.append(money * 100)
    r.insert(0, 0)
    l = []
    for i in range(num):
        l.append((r[i + 1] - r[i]) / 100)
    return l
print(red_lv1(200, 10))  # [5.01, 36.25, 5.94, 35.62, 4.96, 0.07, 56.16, 11.68, 3.92, 40.39]
  • 紅包3.0版
import random
def red_lv2(money, num):
    r = random.sample(range(1, money * 100), num - 1)
    r.sort()
    r.append(money * 100)
    r.insert(0, 0)
    return [(r[i + 1] - r[i]) / 100 for i in range(num)]
print(red_lv2(200, 10))  # [0.61, 74.34, 10.32, 52.56, 0.36, 23.64, 1.01, 29.84, 2.45, 4.87]
  • 紅包4.0版
import random
def red_lv3(money, num):
    r = random.sample(range(1, money * 100), num - 1)
    r.extend([0, money * 100])
    r.sort()
    return [(r[i + 1] - r[i]) / 100 for i in range(num)]
print(red_lv3(200, 10))  # [8.99, 1.19, 6.68, 8.5, 15.29, 34.54, 88.79, 3.58, 28.95, 3.49]
  • 紅包5.0 生成器版
import random
def red_lv_g(money, num):
    r = random.sample(range(1, money * 100), num - 1)
    r.extend([0, money * 100])
    r.sort()
    for i in range(num):
        yield (r[i + 1] - r[i]) / 100
print(list(red_lv_g(200, 10)))  # [46.4, 2.17, 1.57, 3.08, 2.84, 22.74, 13.01, 89.63, 12.17, 6.39]
import random
from time import sleep

# 所有涉及金額的浮點數都需要用 round 方法保留2位小數,避免出現最終結果多出0.01
amount = round(float(input('請設置紅包的金額 > ')), 2)
num = int(input('請設置紅包的數量 > '))
hb_dict = {}
xing = '趙錢孫李周吳鄭王'
ming = '一二三四五六七八九十'

while num:

xingming = random.choice(xing) + random.choice(ming) + random.choice(ming)
<span class="hljs-keyword">if</span> xingming <span class="hljs-keyword">in</span> hb_dict.keys():
    xingming = random.choice(xing) + random.choice(ming) + random.choice(ming)

num -= <span class="hljs-number">1</span>
<span class="hljs-keyword">if</span> num == <span class="hljs-number">0</span>:
    print(<span class="hljs-string">'%s搶到紅包%.2f元 紅包搶完了!'</span> % (xingming, amount))
    hb_dict[amount] = xingming
    amount -= amount
<span class="hljs-keyword">elif</span> num &gt; <span class="hljs-number">0</span>:
    hb = round(random.uniform(<span class="hljs-number">0.01</span>, amount) / num, <span
            class="hljs-number">2</span>)
    hb_dict[hb] = xingming
    <span class="hljs-comment"># 算法: 在0.01到紅包總金額之間隨機一個浮點數 / 紅包剩余個數</span>
    print(<span class="hljs-string">'%s搶到紅包%.2f元 剩余%d個!'</span> % (xingming, hb, num))
    amount = round((amount - hb), <span class="hljs-number">2</span>)

sleep(<span class="hljs-number">1</span>)

# 轉置字典中的 key / value
# hb_dict2 = {value:key for key,value in hb_dict.items()}
max_hb = max(hb_dict.items())
print('%s運氣最佳 搶得%.2f元!!' % (max_hb[1], max_hb[0]))
'''結果如下:
請設置紅包的金額 &gt; 200
請設置紅包的數量 &gt; 10
李四二搶到紅包3.07元 剩余9個!
趙七一搶到紅包19.44元 剩余8個!
王一九搶到紅包23.82元 剩余7個!
李三七搶到紅包16.08元 剩余6個!
周十二搶到紅包15.65元 剩余5個!
孫六一搶到紅包7.56元 剩余4個!
鄭九二搶到紅包18.61元 剩余3個!
錢一四搶到紅包34.25元 剩余2個!
李九三搶到紅包28.05元 剩余1個!
李七三搶到紅包33.47元 紅包搶完了!
錢一四運氣最佳 搶得34.25元!!
'''




that's all

see also:random --- 生成偽隨機數 | Python random模塊


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM