3.11 �机选择¶
问题¶
ä½ æƒ³ä»Žä¸€ä¸ªåº�列ä¸éš�机抽å�–è‹¥å¹²å…ƒç´ ï¼Œæˆ–è€…æƒ³ç”Ÿæˆ�å‡ ä¸ªéš�机数。
解决方案¶
random 模å�—有大é‡�的函数用æ�¥äº§ç”Ÿéš�机数和éš�æœºé€‰æ‹©å…ƒç´ ã€‚
比如,è¦�想从一个åº�列ä¸éš�机的抽å�–ä¸€ä¸ªå…ƒç´ ï¼Œå�¯ä»¥ä½¿ç”¨ random.choice() :
>>> import random
>>> values = [1, 2, 3, 4, 5, 6]
>>> random.choice(values)
2
>>> random.choice(values)
3
>>> random.choice(values)
1
>>> random.choice(values)
4
>>> random.choice(values)
6
>>>
为了æ��å�–出N个ä¸�å�Œå…ƒç´ çš„æ ·æœ¬ç”¨æ�¥å�šè¿›ä¸€æ¥çš„æ“�作,å�¯ä»¥ä½¿ç”¨ random.sample() :
>>> random.sample(values, 2)
[6, 2]
>>> random.sample(values, 2)
[4, 3]
>>> random.sample(values, 3)
[4, 3, 1]
>>> random.sample(values, 3)
[5, 4, 1]
>>>
å¦‚æžœä½ ä»…ä»…å�ªæ˜¯æƒ³æ‰“ä¹±åº�列ä¸å…ƒç´ 的顺åº�,å�¯ä»¥ä½¿ç”¨ random.shuffle() :
>>> random.shuffle(values)
>>> values
[2, 4, 6, 5, 3, 1]
>>> random.shuffle(values)
>>> values
[3, 5, 2, 1, 6, 4]
>>>
生��机整数,请使用 random.randint() :
>>> random.randint(0,10)
2
>>> random.randint(0,10)
5
>>> random.randint(0,10)
0
>>> random.randint(0,10)
7
>>> random.randint(0,10)
10
>>> random.randint(0,10)
3
>>>
为了生�0到1范围内�匀分布的浮点数,使用 random.random() :
>>> random.random()
0.9406677561675867
>>> random.random()
0.133129581343897
>>> random.random()
0.4144991136919316
>>>
如果�获�N��机�(二进制)的整数,使用 random.getrandbits() :
>>> random.getrandbits(200)
335837000776573622800628485064121869519521710558559406913275
>>>
讨论¶
random 模�使用 Mersenne Twister 算法�计算生��机数。这是一个确定性算法,
ä½†æ˜¯ä½ å�¯ä»¥é€šè¿‡ random.seed() 函数修改åˆ�始化ç§�å�。比如:
random.seed() # Seed based on system time or os.urandom()
random.seed(12345) # Seed based on integer given
random.seed(b'bytedata') # Seed based on byte data
除了上述介�的功能,random模�还包�基于�匀分布�高斯分布和其他分布的�机数生�函数。
比如, random.uniform() 计算å�‡åŒ€åˆ†å¸ƒéš�机数, random.gauss() è®¡ç®—æ£æ€�分布éš�机数。
对于其他的分布情况请�考在线文档。
在 random 模å�—ä¸çš„函数ä¸�应该用在和密ç �å¦ç›¸å…³çš„程åº�ä¸ã€‚
å¦‚æžœä½ ç¡®å®žéœ€è¦�类似的功能,å�¯ä»¥ä½¿ç”¨ssl模å�—ä¸ç›¸åº”的函数。
比如, ssl.RAND_bytes() å�¯ä»¥ç”¨æ�¥ç”Ÿæˆ�一个安全的éš�机å—节åº�列。