(Axure):random、sin等函数的用法
先看示例:
random():返回0 ~ 1之间的随机数
sin(x):返回数的正弦
sqrt(x):返回数的平方根
tan(x):返回角的正切
业务场景:第一个random(),点击提交,对应出来的返回值为0-1之间的小数;后面四个也一样,通过输入值来返回相应值。
实现思路:通过按钮、输入框、标签等元件,表达函数效果。
操作方法:
1、拖入4个文字标签,分别输入random()、sin(x)、sqrt(x)、tan(x);再拖入5个文字标签,置于文字下方,一一对应,分别命名为“random()”、“random()1”、”sin(x)”、“sqrt(x)”、“tan(x)”;
2、拖入5个输入框,分别命名为各个函数的文本名称,根据函数的需要放置不同的个数;
3、分别拖入5个按钮,一 一对应;
4、在按钮上设置条件。
(原创版权,请勿商用。原文地址:http://www.guanjunrui.com/?p=1188。全部文章请点击下方的“互联网人 学习!学习!学习!”,进入官方网站,谢谢!)
python应用之random模块(居然还有那么多的随机算法函数)
random 是 Python 的一个常用的内置模块,模块提供了生成随机数的功能,包含了多种生成随机数的函数,比如生成随机整数、随机浮点数、从序列中随机选择元素等。
要使用 random模块,直接导入它即可。
以下是random模块提供的主要函数:
生成一个[0.0, 1.0)范围内的不包含整数1随机浮点数(大于等于0,小于1的小数)。
测试代码:
执行后结果:
0.3336493107060039
如果想保留小数,可以用round函数或者decimal.Decimal函数
1)使用round函数保留几位小数,在round第2个参数中传入数字几,比如保留3位小数
2)使用Decimal函数,保留3位小数
Decimal模块的用法可参见之前的文章:
生成一个指定范围内的随机整数,包括a和b的值
测试代码:
多次执行后结果:
69
19
67
从指定的范围内返回一个随机整数,类似于range()函数。randint函数其实调用的也是该函数。
关于参数:
- 如果不传stop和step参数,start参数必须大于0,否则报错。此时会随机生成比start小的整数。
- 如果不传stop,传的step参数必须等于1,否则会报错。
- 如果传了stop和step参数,step不等于1时则随机生成一个start和stop之间步长为step的整数。step=1时生成在start和stop之间,并且小于stop的数(不同于randint函数)
具体的按照step计算方式参考源代码:
测试代码:
#随机生成1到1000步长为10的整数
#随机生成5到99之间的整数
#随机生成小于100的整数
从非空序列seq中随机选取一个元素。seq是支持切片的对象,比如列表list,元组tuple,字符串str,字节串bytes等。
测试代码:
从给定的序列中随机选择1个或者多个元素,返回的是列表list;我们可以指定每个元素被选中的概率,或者指定要选择的元素数量。该函数在Python 3.6及更高版本中才支持。
参数:
- population:一个支持切片的序列,用于从中随机选择元素。
- weights(可选):一个序列,指定了population中每个元素被选中的相对概率;weights的长度需要等于population的长度;默认情况下,所有元素的选中概率是相等的。
- k(可选):一个整数,指定要选择的元素数量。默认为1。K可以大于序列的长度。
- cum_weights(可选):一个序列,用于指定累积权重。cum_weights的长度需要等于population的长度;如果提供了cum_weights,则不能传weights,否则报错;累积权重的值应该由小到大。
测试代码:
结果:前4个每次执行结果可能不同,最后一个因为权重设置问题每次都是结果[1,1]
[4, 5]
[2, 3, 4, 3, 4, 2]
[2, 1]
[1, 5]
[1, 1]
用于打乱序列x的元素。函数会直接修改序列x,没有return。
参数:
- x : 支持切片的序列
- random:默认为none,也可以传random.random函数。不过该参数从Python 3.9开始,将在后续版本中删除。
测试代码:
结果:
[1, 3, 5, 4, 2]
[5, 2, 1, 4, 3]
从指定的序列population中随机获取k个不重复的元素,并返回一个list。
参数:
- population:一个支持切片的序列,用于从中随机选择元素。
- k:一个整数,指定要选择的元素数量。K不能大于序列的长度。
- counts:可以指定序列population中元素重复的次数;传入的是一个数字元素的序列,序列长度跟population一致;数字越大,元素重复的次数变多,意味着被随机到的概率也会变大,也会返回相同的元素;如果不带这个参数,返回的元素不会重复。
举例:
上述seq_list 等同于[1,1,2,2,3], 第1个和第2个元素重复2次。
测试代码:
随机生成n个字节的字节码。
测试代码:
结果:
b\’\\xff\\x19\\xb7*{\\x88\\x9d\\xb5\\xea-\\x10\\x1dA}\\xa9\\xce\\xaf$\\xf8\\x0f\’
随机生成k个比特位bit(1个字节=8的比特位),返回一个在范围在[0, 2**k) 范围内的随机整数。上面的randbytes函数调用的就是该函数。
测试代码:
结果: 每次执行结果不同
503161
设置a等于某个值时,确保每次运行程序时生成的随机数序列都是相同的。保持默认值,每次运行程序时生成的随机数序列可能会不同。
测试代码:
每次执行后结果都一样
生成一个在指定范围内[a, b](包含a和b)的随机浮点数。a和b可以是整数或者浮点数。
测试代码:
执行后返回的浮点数每次都不同
3.1062124017808896
- normalvariate(mu,sigma): 返回一个符合正态分布(均值为mu,标准差为sigma)的随机浮点数。
- gauss (mu,sigma): 同normalvariate功能。
- triangular(low=0.0, high=1.0, mode=None): 返回一个生成三角形分布的随机数。
- lognormvariate(mu,sigma): 返回一个符合对数正态分布(均值为mu,标准差为sigma)的随机浮点数。
- expovariate(lambd)函数用于生成一个符合指数分布的随机浮点数。lambd必须是大于0的浮点数。
- vonmisesvariate(mu, kappa)函数用于生成一个符合冯·米塞斯(Von Mises)分布的随机浮点数。
- gammavariate(alpha, beta)函数用于生成一个符合伽马(Gamma)分布的随机浮点数。
- betavariate(alpha, beta)函数用于生成一个符合贝塔(Beta)分布的随机浮点数。
- paretovariate(alpha)函数用于生成一个符合帕累托(Pareto)分布的随机浮点数。
- paretovariate(alpha, beta)函数用于生成威布尔(Weibull)分布的随机数。
内容比较多,欢迎大家点赞收藏后学习。
共勉: 东汉·班固《汉书·枚乘传》:“泰山之管穿石,单极之绠断干。水非石之钻,索非木之锯,渐靡使之然也。”
—–指水滴不断地滴,可以滴穿石头;
—–比喻坚持不懈,集细微的力量也能成就难能的功劳。
—-感谢读者的阅读和学习,谢谢大家。
Java随机数之System/Random/SecureRandom详解
本系列为:从零开始学Java,为千锋资深Java教学老师独家创作
致力于为大家讲解清晰Java学习相关知识点,含有丰富的代码案例及讲解。如果感觉对大家有帮助的话,可以【关注】持续追更~
文末有本文重点总结!关于技术类问题,也欢迎大家和我们沟通交流!
我们在解决实际问题时,除了经常需要对数字、日期、时间进行操作之外,有时候还需要对系统进行设置,另外还需要生成一些随机数字。
那么我们又该如何实现这些需求呢?接下来我们会带着大家来学习一下Java中的另几个常用类,包括System、Random、SecureRandom等。
全文大约 【4000】字, 不说废话,只讲可以让你学到技术、明白原理的纯干货!本文带有丰富的案例及配图,让你更好地理解和运用文中的技术概念,并可以给你带来具有足够启迪的思考…
System类位于java.lang包中,代表着当前Java程序的运行平台,系统级的很多属性和控制方法都放在该类中。
由于该类的构造方法是private的,所以我们无法直接通过new的方式来创建该类的对象。System类提供了一些静态变量和静态方法,允许我们直接通过System类来调用这些类变量和类方法。在System类中,虽然有挺多的静态变量和方法,但对我们来说,只需记住一些常用的即可。
System类中常用的静态变量有如下几个:
● PrintStream out:标准输出流;
● InputStream in:标准输入流;
● PrintStream err:标准错误输出流;
1.2 常用静态方法
System类中常用的静态方法有如下几个:
● currentTimeMillis():返回当前的计算机时间;
● exit():终止当前正在运行的 Java 虚拟机;
● gc():请求系统进行垃圾回收,完成内存中的垃圾清除;
● getProperty():获得系统中属性名为 key 的属性对应的值;
● arraycopy():进行数组复制,即从指定源数组中复制一个数组。
接下来我们就把
以上这些静态变量和静态方法的基本使用,给大家简要介绍一下。
首先我们来看看System类中几个常用静态变量该如何使用。
2.1 out
out静态变量属于PrintStream类型,是System类中的标准输出流,用于接收要输出的数据。out中的数据内容通常会输出到显示器,或用户指定的某个输出目标。其实对我们来说,out并不陌生,可以说在我们之前的案例中经常使用,尤其是out中的print方法,最近我们一直在使用。但我们要搞清楚,print属于PrintStream流的方法,并不是 System类的方法。
in静态变量属于InputStream类型,是System类中的标准输入流,用于接收输入的数据。in通常是对应着键盘的输入,或是用户指定的另一个输入源。我们在之前的案例中,也简单使用过in常量,但它没有out用的那么频繁。
上面的这个案例,System.in.read()语句可以读入一个字符,read()方法是InputStream类拥有的方法。变量c必须用 int 类型,而不能用char类型,否则可能会丢失精度而导致编译失败。另外上面的程序,如果输入的是汉字将不能正常输出。如果我们想正常输出汉字,需要把 System.in声明为 InputStreamReader类型的实例。比如
InputStreamReader in=new InputStreamReader(System.in,\”GB2312\”),此时就可以读入完整的Unicode码,才能显示正常的汉字。
err静态变量属于PrintStream类型,是System类中的标准错误输出流,用于接收要输出的数据。err中的数据内容通常会输出到显示器,或用户指定的某个输出目标。其用法与System.out一样,只是不需要我们提供参数就可以输出错误信息,也可以用来输出用户指定的其他信息,包括一些变量的值。
以上这几个静态变量都很简单,大家记住其用法即可。
接下来再跟大家说说System类中的几个常用静态方法的用法。
currentTimeMillis()方法用于返回当前计算机的时间戳,时间格式是当前计算机的时间与GMT时间(格林尼治时间),自1970年 1月 1日 0时 0分 0秒以来所经历的毫秒数,我们一般用它来测试程序的执行时间。通过调用currentTimeMillis()方法,我们可以获得一个长整型的数字,该数字是以差值表达的当前时间。其实currentTimeMillis()方法我们在之前的文章中已经详细讲解过,这里就不再细说了。
exit()方法用于终止当前正在运行的Java虚拟机,也就是可以用于退出程序。该方法需要一个整型的status参数,0表示正常退出,非零表示异常退出。我们使用该方法,可以在图形界面编程中实现程序的退出功能。该方法的用法如下:
gc()方法用于请求对系统主动进行垃圾回收,完成内存中的垃圾清除。但系统是否会立刻回收这些垃圾,却取决于系统中垃圾回收算法的具体实现,以及系统执行时的具体情况。一般我们在开发时不会主动调用该方法,有时候调用了也未必有效果。
getProperty()方法可以根据指定的key,获得系统中对应的某些属性值,系统中常见的属性名及其属性如下表所示:
arraycopy()方法用于数组复制,可以从指定的源数组中复制出一个数组,复制会从指定的位置开始,到目标数组的指定位置结束。arraycopy()方法一般有5个参数,其中,src表示源数组,srcPos表示从源数组中复制的起始位置,dest表示目标数组,destPos表示要复制到的目标数组的起始位置,length表示复制的个数。
我们在开发时,除了操作一些固定的数字之外,有时候还要操作一些不确定的随机数。Java中给我们提供了两种生成指定范围内随机数的方法:
● 使用Random类:伪随机数类,用来创建伪随机数。所谓伪随机数,就是指我们只要给定一个初始的种子,产生的随机数序列是完全一样的;
● 调用Math类的random()方法:Math.random()内部其实是在调用Random类,它也是伪随机数,但我们无法指定种子。
Random类为我们提供了比较丰富的随机数生成方法,比如nextInt()、nextLong()、nextFloat()、nextDouble()等方法。这些方法可以产生boolean、int、long、float、byte数组以及double类型的随机数,这是它比random()方法更好的地方,random()方法只能产生0~1之间的double类型随机数。
而且Random类提供的所有方法,生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的概率是均等的。Random类位于java.util包中,该类有如下两个常用的构造方法:
● Random():默认利用当前系统的时间戳作为种子数,使用该种子数构造出Random对象。
● Random(long seed):使用单个的long类型参数,创建一个新的随机数生成器。
在Random类中,有如下一些常用的API方法供我们操作随机数:
接下来我们通过一个案例,来给大家讲解一下上述方法该如何使用。
但是我们从上面的案例中,会发现每次生成的随机数可能都是不同的,并没有体现出伪随机数的特性,这是为什么呢?其实这是因为我们创建Random实例时,如果没有给定种子,默认是使用系统的当前时间戳作为种子。因此每次运行时,种子都不同,所以得到的伪随机数序列就不同。如果我们在创建Random实例时指定一个固定的种子,就会得到完全确定的随机数序列。
之前给大家说过,Random是一种伪随机数类。这时候就有小伙伴问了,那有没有真随机数类呢?
当然是有的!
SecureRandom就是一种真随机数!
从原理来看,SecureRandom内部使用了RNG (Random Number Generator,随机数生成)算法,来生成一个不可预测的安全随机数。但在JDK的底层,实际上SecureRandom也有多种不同的具体实现。有的是使用安全随机种子加上伪随机数算法来生成安全的随机数,有的是使用真正的随机数生成器来生成随机数。实际使用时,我们可以优先获取高强度的安全随机数生成器;如果没有提供,再使用普通等级的安全随机数生成器。但不管哪种情况,我们都无法指定种子。
因为这个种子是通过CPU的热噪声、读写磁盘的字节、网络流量等各种随机事件产生的“熵”,所以这个种子理论上是不可能会重复的。这也就保证了SecureRandom的安全性,所以最终生成的随机数就是安全的真随机数。
尤其是在密码学中,安全的随机数非常重要。如果我们使用不安全的伪随机数,所有加密体系都将被攻破。因此,为了保证系统的安全,我们尽量使用SecureRandom来产生安全的随机数。
SecureRandom 给我们提供了 nextBoolean()、nextBytes()、nextDouble()、nextFloat()、nextInt() 等随机数生成方法,如下图所示:
接下来我们就通过一个案例,来看看到底该如何生成一个安全的随机数。
至此,就把与系统类、伪随机数、真随机数等相关的类给大家介绍完了,这样我们就把开发时的一些常见类介绍完毕了。今天的重点内容是:
● System:代表着当前Java程序的运行平台,系统级的很多属性和控制方法都放在该类中;
● Random:生成伪随机数;
● SecureRandom:生成安全的真随机数。
往期精彩推荐:
更多技术类干货/IT资讯、关注
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。