天天看點

Python随機點名系統和random一、講解random二、随機點名表

文章目錄

  • 一、講解random
    • 1.random.shuffle(lists)
    • 2.random.random()
    • 3.random.randrange(1,10)
    • 4.random.sample(lists,4)
    • 5.random.choice(lists)
    • 6.random.randint(1,10)
  • 二、随機點名表
    • 1.==題目:==定義一個函數,輸入名字清單,輸入随機數量,提取相應數量的名字,當次提取的名字不能有重複。
      • 第一步、用清單生成式99個名字
      • 第二步、定義函數
        • 1.第一種random.shuffle(m)
        • 2.第二種random.choice(m)
        • 3.第三種random.randrange(m)

一、講解random

import random
lists = [1,2,3,4,5,6,7,8,9]
           

1.random.shuffle(lists)

import random
lists = [1,2,3,4,5,6,7,8,9]
random.shuffle(lists) #打亂清單
print(lists)
結果:[3, 7, 5, 1, 6, 2, 9, 4, 8]
           

2.random.random()

import random
print(random.random())  #生成0~1之間的随機小數字
結果:0.019600727614542124
           

3.random.randrange(1,10)

import random
print(random.randrange(1,10))  #1~9裡面随機取值,取得是整數
結果:2
           

4.random.sample(lists,4)

import random
lists = [1,2,3,4,5,6,7,8,9]
print(random.sample(lists,4))   #從lists裡面随機取4個值,每次傳回結果不一樣
結果:[5, 6, 7, 9]
           

5.random.choice(lists)

import random
lists = [1,2,3,4,5,6,7,8,9]
print(random.choice(lists))    # #從lists裡面随機取1個值,每次傳回結果不一樣
結果:4
           

6.random.randint(1,10)

import random
import time
print(random.randint(1,10))        #1~9裡面随機取1個值,取得是整數
結果:10
           

二、随機點名表

1.==題目:==定義一個函數,輸入名字清單,輸入随機數量,提取相應數量的名字,當次提取的名字不能有重複。

第一步、用清單生成式99個名字

lists = ['admin{}'.format(x) for x in range(1,100)]  #用清單生成式99個名字
print(lists)
           

第二步、定義函數

1.第一種random.shuffle(m)

import random
lists = ['admin{}'.format(x) for x in range(1,100)]  #用清單生成式99個名字
print(lists)
def get_random_name(m,num):    #num随機取幾個名字
    random.shuffle(m)
    if len(m)>=num:            #把裡面順序打亂就可以取值了,先判斷裡面的數量
        return m[:num]         #傳回整成的值,從開頭取到随機num
    else:
        return '名字數量不足!'
print(get_random_name(lists,1000))  #随便叫什麼都行,實際上是把lists傳給m
結果:傳回100個人名字
名字數量不足
           

2.第二種random.choice(m)

import random
lists = ['admin{}'.format(x) for x in range(1,100)]  #用清單生成式99個名字
print(lists)
def get_random_name(m,num):
    if len(m) >= num:
        lists = []
        for i in range(num):
            lists.append(random.choice(m))
        return lists
    else:
        return '名字數量不足!'

print(get_random_name(lists,5))

#出現的問題:這個辦法會取到重複的值,該怎麼辦?
           
步驟
1.random.choice(lists)
2.定義一個空清單,lists = []
3.管道的值用空清單裝一下lists.append(random.choice(lists))
4.要幾個值就循環幾次、for i in range(num):
5.最後傳回一個return lists
6.choice裡面應該寫m,lists.append(random.choice(m))
7.print(get_random_name(lists,10))
8.當然判斷也可以粘貼過來用 if len(m) >= num:
else:
        return '名字數量不足!'
           
#出現的問題:這個辦法會取到重複的值,該怎麼辦?
方案:把lists = []變成集合lists = set([]),因為集合會自動給去掉重複的值。
然後把把lists.append(random.choice(m))變成lists.add(random.choice(m))
           
import random
lists = ['admin{}'.format(x) for x in range(1,100)]  #用清單生成式99個名字
print(lists)
def get_random_name(m,num):
    if len(m) >= num:
        lists = set([])
        for i in range(num):
            lists.add(random.choice(m))
        return lists
    else:
        return '名字數量不足!'

#print(get_random_name(lists,5))
print(get_random_name(lists,5),len(get_random_name(lists,20)))
           
#再統計一下集合裡面取的值的長度,len(get_random_name(lists,5))
出現問題,{'admin62', 'admin68', 'admin10', 'admin35', 'admin60'} 17,取得值不夠20個。

原因:往裡面确實添加了20個值,但是集合自動去重,是以留到裡面的會減少

解決方案:不是要20個值嘛,
1.那就寫一個死循環,while True:
2.什麼時候停呢?那就寫一個判斷,判斷這個幾個,存夠20個值,就跳出這個循環
     if len(m) == num:
         lists = set([])
            break
           
import random
lists = ['admin{}'.format(x) for x in range(1,100)]  #用清單生成式99個名字
print(lists)
def get_random_name(m,num):
    if len(m) >= num:
        lists = set([])
        while True:
            if len(lists)==num:
                break
            lists.add(random.choice(m))
        return lists
    else:
        return '名字數量不足!'

print(get_random_name(lists,20),len(get_random_name(lists,20)))  #随便叫什麼都行,實際上是把lists傳給m
           
問題:計算量變大,把名字變成for x in range(1,10000)]  #用清單生成式10000個名字,時間就會很長

寫一個計算時間的函數,我們需要引用一個新的包,import time

程式開始之前先記錄一個開始的時間戳
begin = time.time()
print(get_random_name(lists,90000),len(get_random_name(lists,90000)))
stop = time.time()
print(stop-begin)

顯示時間是:0.43766021728515625s
           
思路:重複的名字一直在集合裡面,可以把重複的彈出去,等下一次進來的時候就不會重複了。
1.先寫核心,判斷等會再加
2.把裡面的删除remove

import random
lists = ['admin{}'.format(x) for x in range(1,100)]  #用清單生成式99個名字
print(lists)
def get_random_name(m,num):
    if len(m) >= num:
        lists = []
        for i in range(num):
            data = random.choice(m)
            lists.append(data)
            m.remove(data)  #數字大了很慢
        return lists
    else:
        return '名字數量不足'

print(get_random_name(lists,20),len(get_random_name(lists,20)))  #随便叫什麼都行,實際上是把lists傳給m

數字大了很慢,換random.randrange(m)試一試
           

3.第三種random.randrange(m)

import random
lists = ['admin{}'.format(x) for x in range(1,100)]  #用清單生成式99個名字
print(lists)

def get_random_name(m,num):
    if len(m) >= num:
        lists = set([])
        while True:
            if len(lists) == num:
                break
            data = random.randrange(len(m))
            #m.pop(data)
            lists.add(m.pop(data))
            # data = random.choice(m)
            # lists.add(data)
            # m.remove(data)
        return lists
    else:
        return '名字數量不足'

print(get_random_name(lists,10))  #随便叫什麼都行,實際上是把lists傳給m


print(get_random_name(lists,20),len(get_random_name(lists,20)))
begin = time.time()
print(get_random_name(lists,900000),len(get_random_name(lists,900000)))
stop = time.time()
print(stop-begin)
           
測試的時間結果:
# 0.43766021728515625
# 4.4  9000000第二種方法random.choice(m)
# 1.6  9000000第一種方法random.shuffle(m)
# s
原因:
主要是清單結構和字典結構的問題,差的很多,随機數的數量并沒有這個導緻的問題大,
random.shuffle(m)>random.choice(m)>random.randrange(m)