随机数大总结(Java,Python,C++)

10 篇文章 0 订阅

本文主要是在三大语言当中,如何产生随机数的方法。

Java

在Java中有两种产生随机数的方法,一种是Math类的random()方法,一种是使用Random类。

Random 类提供了丰富的随机数生成方法,可以产生 boolean、int、long、float、byte 数组以及 double 类型的随机数,这是它与 random() 方法最大的不同之处。random() 方法只能产生 double 类型的 0~1 的随机数。

Random 类位于 java.util 包中,该类常用的有如下两个构造方法。

  • Random():该构造方法使用一个和当前系统时间对应的数字作为种子数,然后使用这个种子数构造 Random 对象。
  • Random(long seed):使用单个 long 类型的参数创建一个新的随机数生成器。

Random 类提供的所有方法生成的随机数字都是均匀分布的,也就是说区间内部的数字生成的概率是均等的,在表 1 中列出了 Random 类中常用的方法。

Random类

Random 类的常用方法如下:

方法说明
boolean nextBoolean()生成一个随机的 boolean 值,生成 true 和 false 的值概率相等
double nextDouble()生成一个随机的 double 值,数值介于 [0,1.0),含 0 而不包含 1.0
int nextlnt()生成一个随机的 int 值,该值介于 int 的区间,也就是 -231~231-1。如果需要生成指定区间的 int 值,则需要进行一定的数学变换
int nextlnt(int n)生成一个随机的 int 值,该值介于 [0,n),包含 0 而不包含 n。如果想生成指定区间的 int 值,也需要进行一定的数学变换
void setSeed(long seed)重新设置 Random 对象中的种子数。设置完种子数以后的 Random 对象和相同种子数使用 new 关键字创建出的 Random 对象相同
long nextLong()返回一个随机长整型数字
float nextFloat()返回一个随机浮点型数字
import java.util.Random;

public class Test {
    public static void main(String[] args) {
        Random r = new Random();
        double d1 = r.nextDouble(); // 生成[0,1.0)区间的小数
        double d2 = r.nextDouble() * 7; // 生成[0,7.0)区间的小数
        int i1 = r.nextInt(10); // 生成[0,10)区间的整数
        int i2 = r.nextInt(18) - 3; // 生成[-3,15)区间的整数
        int max = 1, min = 9;
        int i3 = r.nextInt(max)%(max-min+1) + min;	// 生成[min, max]区间的整数
        long l1 = r.nextLong(); // 生成一个随机长整型值
        boolean b1 = r.nextBoolean(); // 生成一个随机布尔型值
        float f1 = r.nextFloat(); // 生成一个随机浮点型值
        System.out.println("生成的[0,1.0)区间的小数是:" + d1);
        System.out.println("生成的[0,7.0)区间的小数是:" + d2);
        System.out.println("生成的[0,10)区间的整数是:" + i1);
        System.out.println("生成的[-3,15)区间的整数是:" + i2);
        System.out.println("生成的[1, 9]区间的整数是:" + i3);
        System.out.println("生成一个随机长整型值:" + l1);
        System.out.println("生成一个随机布尔型值:" + b1);
        System.out.println("生成一个随机浮点型值:" + f1);
    }
}

/* 运行结果
生成的[0,1.0]区间的小数是:0.04715559303077166
生成的[0,7.0]区间的小数是:5.912615617255234
生成的[0,10]区间的整数是:5
生成的[-3,15]区间的整数是:10
生成的[1, 9]区间的整数是:9
生成一个随机长整型值:4135422081914082875
生成一个随机布尔型值:false
生成一个随机浮点型值:0.74356645
*/

这里没有设置随机种子,所以运行结果各不相同,可以自行运行查看结果

Math类

Math 类的 random() 方法没有参数,它默认会返回大于等于 0.0、小于 1.0 的 double 类型随机数,即 0<=随机数<1.0。对 random() 方法返回的数字稍加处理,即可实现产生任意范围随机数的功能。

import java.lang.Math;
public class Test {
    public static void main(String[] args) {
        double d1 = Math.random(); // 生成[0,1.0)区间的小数     
        System.out.println("生成的[0,1.0)区间的小数是:" + d1);
    }
}

Python

对于python,产生随机数也是非常的简单,话不多说直接上代码

import random
 
print("r1:", random.random())			# 返回[0.0, 1.0)随机浮点数
print("r2:", random.uniform(3, 8))		# 返回[3.0, 8.0]随机浮点数
print("r3:", random.randint(0,9))		# 返回[0, 9]随机浮整数,注意右闭
print("r4:", random.randrange(10, 100, 2))		# 返回[10, 100)步长为2的随机数
nums = [1, 3, 5, 7, 9]
print("r4:", random.choice(nums))		# 返回nums中的随机数,这里nuns也可以是字符串、集合等

"""运行结果
r1: 0.7769709542792284
r2: 7.165029572834008
r3: 2
r4: 16
r5: 9
"""

C++

C++中没有自带的random函数,要实现随机数的生成就需要使用rand()和srand()。

不过,由于rand()的内部实现是用线性同余法做的,所以生成的并不是真正的随机数,而是在一定范围内可看为随机的伪随机数。

#include <iostream>
#include <cstdlib>
using namespace std;

int main()
{
    for (int i = 0; i < 10; i++)
    {
        cout << rand()%100<< " ";
    }
    return 0;
}

// 83 86 77 15 93 35 86 92 49 21   在100中产生随机数

上述代码因为没有设置随机种子,即每次产生的随机数都是一样的。可以利用srand((int)(time(NULL))的方法,利用系统时钟,产生不同的随机数种子。不过要调用time(),需要加入头文件< ctime >。

#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;

int main()
{
    srand((int)time(0));  // 产生随机种子  把0换成NULL也行
    for (int i = 0; i < 10; i++)
    {
        cout << rand()%100<< " ";
    }
    return 0;
}

//13 8 99 28 43 84 34 24 72 19 
//11 90 27 79 94 4 9 42 84 26   两次产生的数据就不一样了

对C++一些随机范围做的一个小总结:

  • 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。
  • 要取得[0,n) 就是rand()%n,表示 从0到n-1的数
  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+a;
  • 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a;
  • 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1;
  • 要取得0~1之间的浮点数,可以使用rand() / double(RAND_MAX)。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值