GVKun编程网logo

Python中numpy.random和random.random之间的性能差异(numpy.random.random())

32

对于想了解Python中numpy.random和random.random之间的性能差异的读者,本文将提供新的信息,我们将详细介绍numpy.random.random(),并且为您提供关于*#【P

对于想了解Python中numpy.random和random.random之间的性能差异的读者,本文将提供新的信息,我们将详细介绍numpy.random.random(),并且为您提供关于*#【Python】【基础知识】【模块】【random】【使用random创造一个随机数】、java.util.Random和java.security.SecureRandom之间的区别、np.random.seed()和np.random.RandomState()之间的区别、numpy : random.rand 和 random.random 的区别的有价值信息。

本文目录一览:

Python中numpy.random和random.random之间的性能差异(numpy.random.random())

Python中numpy.random和random.random之间的性能差异(numpy.random.random())

我想看看我的神经网络中哪种随机数生成器包更快。

我目前正在从github更改代码,其中numpy.random和random软件包都用于生成随机整数,随机选择,随机样本等。

我更改此代码的原因是,出于研究目的,我希望设置一个全局种子,以便能够比较不同超参数设置的准确性。问题在于,此刻我必须为随机包和numpy包设置2个全局种子。理想情况下,我只想设置一个种子,因为来自两个随机数生成器序列的图形可能会变得更快相关。

但是,我不知道哪种软件包在速度方面会更好:numpy或random。因此,我想为两个完全相同的Mersenne
Twister序列对应的软件包找到种子。这样,两个模型的图纸都相同,因此每个梯度下降步骤中的迭代次数也相同,从而导致速度差异仅由我使用的包装引起。

我找不到关于两个包都以相同的随机数序列结尾的成对种子的任何文档,并且尝试各种组合似乎有点麻烦。

我尝试了以下方法:

np.random.seed(1)numpy_1=np.random.randint(0,101)numpy_2=np.random.randint(0,101)numpy_3=np.random.randint(0,101)numpy_4=np.random.randint(0,101)for i in range(20000000):    random.seed(i)    random_1=random.randint(0,101)    if random_1==numpy_1:        random_2=random.randint(0,101)        if random_2==numpy_2:            random_3=random.randint(0,101)            if random_3==numpy_3:                random_4=random.randint(0,101)                if random_4==numpy_4:                    breakprint(np.random.randint(0,101))print(random.randint(0,101))

但这并没有真正发挥作用,正如可以预期的那样。

答案1

小编典典

numpy.random和python的random工作方式不同,尽管正如您所说,它们使用相同的算法。

就种子而言
:可以使用from中的set_stateandget_state函数numpy.random(在python中random称为getstatesetstate),并将状态从一个传递到另一个。结构略有不同(在python中,pos整数附加到状态元组中的最后一个元素)。请参阅numpy.random.get_state()和random.getstate()的文档:

import randomimport numpy as nprandom.seed(10)s1 = list(np.random.get_state())s2 = list(random.getstate())s1[1] = np.array(s2[1][:-1]).astype(''int32'')s1[2] = s2[1][-1]np.random.set_state(tuple(s1))print(np.random.random())print(random.random())>> 0.57140259468991350.5714025946899135

在效率方面 :这取决于您要执行的操作,但是numpy通常更好,因为您可以创建元素数组而不需要循环:

%timeit np.random.random(10000)142 µs ± 391 ns per loop (mean ± std. dev. of 7 runs, 10000 loops each)%timeit [random.random() for i in range(10000)]1.48 ms ± 2.7 µs per loop (mean ± std. dev. of 7 runs, 1000 loops each)

在“随机性”方面
,numpy(根据他们的文档)也更好:

注意:Python stdlib模块“ random”还包含Mersenne
Twister伪随机数生成器,其生成方法与中提供的方法类似RandomStateRandomState除了具有NumPy感知能力外,它还具有提供大量概率分布可供选择的优势。

*#【Python】【基础知识】【模块】【random】【使用random创造一个随机数】

*#【Python】【基础知识】【模块】【random】【使用random创造一个随机数】

Random介绍:

输出随机数。

快照:

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import random
 
#生成 10 到 20 之间的随机数
print(random.uniform(10,20))                      #输出1-20间的随机数(包含整数、小数)
print(random.random())                             #输出0-1间的随机数
print(random.randint(10,20))                      #输出10-20间的随机整数
print(random.choice([10,11,12,13,14,15]))          #随机输出序列内的一个元素
print(random.choice([x for x in range(1,100)]))    #输出1-99间的随机数

 

 

random模块的方法有:

>>> dir(random)
[BPF,LOG4,NV_MAGICCONST,RECIP_BPF,Random,SG_MAGICCONST,SystemRandom,TWOPI,_BuiltinMethodType,_MethodType,_Sequence,_Set,__all__,__builtins__,__cached__,__doc__,__file__,__loader__,__name__,__package__,__spec__,_acos,_bisect,_ceil,_cos,_e,_exp,_inst,_itertools,_log,_os,_pi,_random,_sha512,_sin,_sqrt,_test,_test_generator,_urandom,_warn,betavariate,choice,choices,expovariate,gammavariate,gauss,getrandbits,getstate,lognormvariate,normalvariate,paretovariate,randint,random,randrange,sample,seed,setstate,shuffle,triangular,uniform,vonmisesvariate,weibullvariate]

 

 

uniform 方法的使用:

>>> dir(random.uniform)
[__call__,__class__,__delattr__,__dir__,__eq__,__format__,__func__,__ge__,__get__,__getattribute__,__gt__,__hash__,__init__,__init_subclass__,__le__,__lt__,__ne__,__new__,__reduce__,__reduce_ex__,__repr__,__self__,__setattr__,__sizeof__,__str__,__subclasshook__]
>>> help(random.uniform)
Help on method uniform in module random:

uniform(a,b) method of random.Random instance
    Get a random number in the range [a,b) or [a,b] depending on rounding.

翻译:关于random模块的uniform方法的一些帮助;

random的uniform(a,b) 方法。

random例子:

  在[a,b)  或[a,b]  范围内,根据四舍五入,获取一个随机数。

 

原题:

  使用random创建一个随机数;

 

原题给出的解答:

  

#!/usr/bin/python
# -*- coding: UTF-8 -*-
 
import random
 
#生成 10 到 20 之间的随机数
print(random.uniform(10,20))

 

输出的结果:

  

分享图片

 

   结果精确到小数点后14位;

 

choice方法的使用

random.choice(seq)

  其参数为序列,从序列中随机获取一个随机元素;

  示例:

  

>>> random.choice([1,2,3,4,5,6,7,3])
2
>>> random.choice([1,3])
5
>>> random.choice([1,3])
4
>>> random.choice([1,3])
3
>>> random.choice([1,3])
6
>>> random.choice([1,3])
1
>>> random.choice([1,3])
1
>>> random.choice("test")
t
>>> random.choice("test")
t
>>> random.choice("test")
t
>>> random.choice("test")
e
>>> random.choice("test")
t
>>> random.choice("test")
s
>>> random.choice("test")
e

 

 

 

 

 

————————(我是分割线)————————

参考:

1. RUNOOB.COM:https://www.runoob.com/python/python-exercise-example50.html

2.Python DOC

 

 

备注:

初次编辑时间:2019年10月7日16:12:06

环境:Windows 7   / Python 3.7.2

java.util.Random和java.security.SecureRandom之间的区别

java.util.Random和java.security.SecureRandom之间的区别

如何解决java.util.Random和java.security.SecureRandom之间的区别?

标准的Oracle JDK 7实现使用所谓的线性同余生成器在中生成随机值java.util.Random

取自java.util.Random源代码(JDK 7u2),来自对method的注释,该注释protected int next(int bits)是生成随机值的方法:

这是线性同余伪随机数生成器,由DH Lehmer定义并由Donald E. knuth在 计算机编程艺术,第3卷: 半数值算法,第3.2.1节中进行了描述。

线性同余生成器的可预测性 Hugo Krawczyk就如何预测这些LCG撰写了一篇相当不错的论文(“如何预测同余生成器”)。如果你很幸运和感兴趣,你仍然可以在网络上找到它的免费下载版本。而且,还有更多的研究清楚地表明,绝对不应将LCG用于对安全性至关重要的目的。这也意味着你的随机数现在是可以预测的,对于会话ID等你不需要。

如何打破线性同余生成器 假设攻击者必须在一个完整的周期后必须等待LCG重复,这是错误的。即使具有最佳周期(其递归关系中的模数m),也很容易在比整个周期少的时间内预测未来值。毕竟,这只是一堆模块化方程式,需要解决,只要你观察到足够的LCG输出值,就可以轻松实现。

使用“更好”的种子无法提高安全性。不管你是否使用SecureRandom由多个骰子生成的随机值进行播种甚至生成该值都没关系。

攻击者只会根据观察到的输出值来计算种子。与的情况相比,这花费的时间明显少于 2 ^ 48 java.util.Random。不相信的人可以尝试此实验,该实验表明你可以预测未来的Random输出,而在大约2 ^ 16的时间内仅观察两个(!)输出值。现在,在现代计算机上甚至不需要一秒钟就可以预测随机数的输出。

结论 替换你当前的代码。SecureRandom专门使用。然后,至少你可以保证结果很难预测。如果你需要加密安全的PRNG的属性(在你的情况下,这就是你想要的),那么你就SecureRandom只能使用。聪明地改变应该使用的方式几乎总是会导致安全性降低。

解决方法

我的团队移交了一些生成随机令牌的服务器端代码(Java),我对此有一个疑问-

这些令牌的用途非常敏感-用于会话ID,密码重置链接等。因此,它们确实需要在密码上是随机的,以避免有人猜测它们或对它们进行暴力破解。令牌是“长”的,因此它是64位长。

该代码当前使用java.util.Random该类来生成这些令牌。的文档中java.util.Random明确指出以下内容:

java.util.Random的实例不是加密安全的。考虑改为使用SecureRandom来获取加密安全的伪随机数生成器,以供对安全敏感的应用程序使用。

但是,代码当前使用的方式java.util.Random是-实例化java.security.SecureRandom该类,然后使用该SecureRandom.nextLong()方法获取用于实例化java.util.Random该类的种子。然后使用java.util.Random.nextLong()方法生成令牌。

所以,现在我的问题是-仍在java.util.Random使用进行播种java.security.SecureRandom吗?我是否需要修改代码,使其java.security.SecureRandom专门用于生成令牌?

目前,代码种子是Random启动时的一次

np.random.seed()和np.random.RandomState()之间的区别

np.random.seed()和np.random.RandomState()之间的区别

我知道要播种numpy.random的随机性并能够复制它,我应该:

import numpy as np
np.random.seed(1234)

但是怎么 np.random.RandomState() 办?

numpy : random.rand 和 random.random 的区别

numpy : random.rand 和 random.random 的区别

相同点:两个函数都是在 [0, 1) 的均匀分布中产生随机数。

不同点:参数传递不同。random.random( )接收一个单独的元组,而random.rand( )接收分开的参数

 

np.random.seed(1)
rand = np.random.rand(2, 2)
print(rand)
''''''
[[4.17022005e-01 7.20324493e-01]
 [1.14374817e-04 3.02332573e-01]]
''''''
np.random.seed(1)
random = np.random.random((2, 2))
print(random)
''''''
[[4.17022005e-01 7.20324493e-01]
 [1.14374817e-04 3.02332573e-01]]
''''''

 

两个函数功能完全一样,numpy为什么这么做,这是有历史原因的。可能是为了使 Matlab 用户更容易学习 python+numpy 的组合。把其中一个函数去掉,所带来的麻烦远大于好处,因为有很多现存的代码使用了函数的不同版本。

 

我们今天的关于Python中numpy.random和random.random之间的性能差异numpy.random.random()的分享已经告一段落,感谢您的关注,如果您想了解更多关于*#【Python】【基础知识】【模块】【random】【使用random创造一个随机数】、java.util.Random和java.security.SecureRandom之间的区别、np.random.seed()和np.random.RandomState()之间的区别、numpy : random.rand 和 random.random 的区别的相关信息,请在本站查询。

本文标签: