文章目录

  • 一、讲解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.==题目:==定义一个函数,输入名字列表,输入随机数量,提取相应数量的名字,当次提取的名字不能有重复。

lists = ['admin{}'.format(x) for x in range(1,1000000)]

第一步、用列表生成式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)