python random随机模块使用

随机数模块函数

  • 最近使用了choice、shuffle 对于字典的处理,发现些问题,于是整理一下random模块中函数使用方法及一些问题
#导入随机数模块
import random as rd
复制代码

函数

  • random() #随机获取0~1之间的小数
  • choice(lst/tuple/dict) #随机获取序列中的值,不可以操作集合,操作字典有时会出错
  • shuffle(lst/dict)#随机打乱序列,返回值为None,直接修改序列,不能操作元组和集合,操作字典有时会报错
  • randrange(a,b,n)#指定区间内的整数,取值范围[a,b),不包含b,a,b可以是浮点数,但只能是n.0,a必须小于b
  • uniform(a,b)#指定区间内的数值,可以是复数,取值包含a也包含b,a和b可以相等,a可以小于b
# random() 随机获取0~1之间的小数
a = rd.random()
print(a)
#随机生成一个一位小数
import math
print(math.floor(rd.random()*10)/10)
复制代码
0.7688124235586536
0.3
复制代码
# choice() 从序列中随机获取一个元素,参数为字典时有时会报错,
a = rd.choice([1,2,4,5,7])
print(a)
#一般对于字典的处理是处理key,choice反悔的确是value
dict1 = {0:3,1:4,2:5}#不会报错,长度为n的元素,key为[0-n-1]的之间的整数不会报错,为其他值可能报错,全为字符串一定报错
print(rd.choice(dict1))

dict1 = {'a':3,'b':4,'c':5}#报错
print(rd.choice(dict1))
dict1 = {1:3,6:4,7:5}#有时报错,有时不报错,如果随机获取到的整数为1,则可取到value为3,如果随机获取到为2,则找不到对应的值
print(rd.choice(dict1))
'''random.py中对choice方法的实现如下,先得到0- (len(seq)-1)之间的整数,然后将获取到的整数作为下标去访问序列中的value,找不到就报错了
    def choice(self, seq):
        """Choose a random element from a non-empty sequence."""
        try:
            i = self._randbelow(len(seq))
        except ValueError:
            raise IndexError('Cannot choose from an empty sequence') from None
        return seq[i]
'''

复制代码
2
5



---------------------------------------------------------------------------

KeyError                                  Traceback (most recent call last)

<ipython-input-3-f321c81453d3> in <module>()
      7 
      8 dict1 = {'a':3,'b':4,'c':5}#不会报错,长度为n的元素,key为[0-n-1]的之间的整数不会报错,为其他值可能报错,全为字符串一定报错
----> 9 print(rd.choice(dict1))


D:\ProgramData\Anaconda3\lib\random.py in choice(self, seq)
    256         except ValueError:
    257             raise IndexError('Cannot choose from an empty sequence') from None
--> 258         return seq[i]
    259 
    260     def shuffle(self, x, random=None):


KeyError: 2
复制代码
#如果想要随机获取到字典的key随机值或value值,使用keys()和values()获取到对应的列表,然后从列表中取到随机值
dict1 = {'a':3,'b':4,'c':5}
keys = list(dict1.keys())
values = list(dict1.values())
print(rd.choice(keys))
print(rd.choice(values))
复制代码
b
5
复制代码
# shuffle() 和choice一样对于字典的处理存在会报错的问题
a = [1,2,3,4,5,6]
rd.shuffle(a)
print(a)

''' 和choice相同都是通过下标访问的,所以同样会报错
    def shuffle(self, x, random=None):
        """Shuffle list x in place, and return None.

        Optional argument random is a 0-argument function returning a
        random float in [0.0, 1.0); if it is the default None, the
        standard random.random will be used.

        """

        if random is None:
            randbelow = self._randbelow
            for i in reversed(range(1, len(x))):
                # pick an element in x[:i+1] with which to exchange x[i]
                j = randbelow(i+1)
                x[i], x[j] = x[j], x[i]
        else:
            _int = int
            for i in reversed(range(1, len(x))):
                # pick an element in x[:i+1] with which to exchange x[i]
                j = _int(random() * (i+1))
                x[i], x[j] = x[j], x[i]
'''
复制代码
[3, 6, 2, 1, 4, 5]
复制代码
# randrange()
a = rd.randrange(1,5,2)#只会取到1、3
print(a)
复制代码
3
复制代码
# uniform()
a = rd.uniform(1,5)
print(a)
'''
    def uniform(self, a, b):
        "Get a random number in the range [a, b) or [a, b] depending on rounding."
        return a + (b-a) * self.random()
'''
# uniform参数可以是复数,分别取实数部分和虚数部分,再组成一个复数
a = rd.uniform(1+5j,1+1j)  # 实数部分只会取到1
print(a)

a = rd.uniform(1+5j,1+5j)  # 只会取到(1+5j)
print(a)
复制代码
4.328510673589862
(1+2.2475224962081475j)
(1+5j)
复制代码

转载于:https://juejin.im/post/5a3e1e055188255de57df91d

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值