获取随机数的n种方法,你知道几种

前言

在项目中,我们常常会用到随机数,那你知道几种随机数的生成方法呢,在这里,分享一下我知道的随机数生成方法


1、使用Math.random()方法

Math.random() 产生的随机数是0-1之间的一个double数值,有15位小数,我们可以把他乘以一定的数,比如说乘以100,他就是个100以内的随机

Math.random()获取到的随机数如下

0.6195107792727859

如下,为获取1到10的int类型随机数,+1表示最小值为1,因为random方法的最小值是0

(int)(1+Math.random()*10)

生成0到9的随机数,如下

(int)(Math.random()*10)

想要获得比m小1的int或者long类型数值,只需要使用以下公式

(类型)(Math.random()*m)

想要获得指定范围[最小值,最大值]的随机数,使用以下公式

(数据类型)(最小值+Math.random()*(最大值-最小值+1))

例:获取10到99的随机数

(int)(Math.random()*90+10)

注意:Math.random() 产生的随机数是大于等于0,小于1(不等于1)的double数值


2、Random类

通过Random类来产生一个随机数,这个是专业的Random工具类,功能强大。

使用方法如下:
(01) 创建Random对象。有两种方法可以创建Random对象,如下:

Random random = new Random();//默认构造方法
Random random = new Random(1000);//指定种子数字

(02) 通过Random对象获取随机数。Random支持的随机值类型包括:boolean, byte, int, long, float, double。

比如,获取[0, 100)之间的int整数。方法如下:
int i2 = random.nextInt(100);

构造方法:

// 构造函数(一): 创建一个新的随机数生成器。 
Random() 
// 构造函数(二): 使用单个 long 种子创建一个新随机数生成器: public Random(long seed) { setSeed(seed); } next 方法使用它来保存随机数生成器的状态。
Random(long seed) 

常用方法:

boolean nextBoolean()         // 返回下一个“boolean类型”伪随机数。 
void    nextBytes(byte[] buf) // 生成随机字节并将其置于字节数组buf中。 
double  nextDouble()          // 返回一个“[0.0, 1.0) 之间的double类型”的随机数。 
float   nextFloat()           // 返回一个“[0.0, 1.0) 之间的float类型”的随机数。 
int     nextInt()             // 返回下一个“int类型”随机数。 
int     nextInt(int n)        // 返回一个“[0, n) 之间的int类型”的随机数。 
long    nextLong()            // 返回下一个“long类型”随机数。 

提示:所以若非必要,不要设置随机数种子。

因为在Java中,随机数的产生取决于种子,随机数和种子之间的关系遵从以下两个规则:

种子不同,产生不同的随机数。

种子相同,即使实例不同也产生相同的随机数。

如下:

    Random random1=new Random(1000);
    Random random2=new Random(1000);
    for (int i=0;i<10;i++){
        System.out.print(random1.nextInt(100));

    }
    System.out.println();
    for (int i=0;i<10;i++){
        System.out.print(random2.nextInt(100));

    }

输出

87357624924941456450
87357624924941456450

可以看到,两个不同的实例,但输出的随机数是一模一样的,这就是因为种子相同,所以我们一般不要指定一个种子。

Random()无参构造方法使用的是一个时间值,所以每一次的seed值都不一样
public Random() {
this(seedUniquifier() ^ System.nanoTime());
}


3、ThreadLocalRandom

ThreadLocalRandom类是Java 7新增的一个类,它是Random的增强版。在并发访问的环境下,使用ThreadLocalRandom来代替Random可以减少多线程资源竞争,最终保证系统具有更好的线程安全性。

我们联想一下ThreadLocal。ThreadLocal通过让每一个线程复制一份变量,使得在每个线程对变量进行操作时实际是操作自己本地内存里面的副本,从而避免了对共享变量进行同步。

实际上ThreadLocalRandom的实现也是这个原理,Random的缺点是多个线程会使用同一个原子性种子变量,从而导致对原子变量更新的竞争。

ThreadLocalRandom类的用法与Random类的用法基本相似,它提供了一个静态的current()方法来获取ThreadLocalRandom对象,获取该对象之后即可调用各种nextInt()方法来获取伪随机数了。

ThreadLocalRandom与Random都比Math的random()方法提供了更多的方式来生成各种伪随机数。可以生成浮点类型的伪随机数,也可以生成整型类型的伪随机数,还可以指定生成随机数的范围。

ThreadLocalRandom rand = ThreadLocalRandom.current();
//生成一个4~20的伪随机整数
int val1 = rand.nextInt(4 , 20);
//生成一个2.0~10.0之间的伪随机浮点数
double val2 = rand.nextDouble(2.0 , 10.0);

4、UUID

UUID是jdk1.5中新增的一个类,在java.util下,用它可以产生一个号称全球唯一的ID

UUID生成的形式如下,会有-,所以我们一般会把-去掉

aec0ae4d-59f9-4070-8c5b-13c00a4611b6

使用:

String uuid = UUID.randomUUID().toString();
uuid = uuid.replace("-", "");

5、 获取字母和数字的随机数

如果我们想获取一个字母和数字的随机数,我们可以使用以下方法

 public static final String str="abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";

 public static String getRandomString(int length){
     
     Random random=new Random();
     StringBuffer sb=new StringBuffer();
     for(int i=0;i<length;i++){
       int number=random.nextInt(62);
       sb.append(str.charAt(number));
     }
     return sb.toString();
 }
  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: C语言中生成随机数方法有很多,常用的有以下几种: 1. 使用rand()函数,该函数是C语言标准库中的随机数生成函数。使用前需要先调用srand()函数来设置随机数子。 2. 使用rand_r()函数,该函数与rand()函数类似,但是rand_r()函数可以在多线程环境下使用。 3. 使用random()函数,该函数是C++标准库中的随机数生成函数,也可以在C语言中使用。 示例代码: ``` #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { srand(time(0)); // 设置随机数子 int num = rand() % 100; // 生成0~99的随机数 printf("随机数: %d", num); return 0; } ``` 请注意:rand()函数生成的随机数并不是真正的随机数,而是伪随机数,如果您需要生成真正的随机数,请使用其他方法,例如使用硬件生成随机数。 ### 回答2: 在C语言中,可以使用标准库中的函数来生成随机数。以下是常用的两方法: 1. 使用time函数和rand函数相结合生成随机数。 首先需要调用time函数来获取当前时间的时间戳,然后将时间戳作为随机数生成的子,再调用rand函数来生成随机数。具体代码如下: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { // 获取当前时间的时间戳 srand(time(NULL)); // 生成并输出随机数 int randomNum = rand(); printf("随机数:%d\n", randomNum); return 0; } ``` 2. 使用rand函数生成指定范围的随机数。 默认情况下,rand函数会生成一个介于0和RAND_MAX之间的伪随机整数。如果要生成指定范围内的随机数,可以通过取模运算和加法来调整范围。具体代码如下: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { // 获取当前时间的时间戳 srand(time(NULL)); // 定义随机数的上限和下限 int min = 1; int max = 100; // 生成并输出指定范围内的随机数 int randomNum = rand() % (max - min + 1) + min; printf("随机数:%d\n", randomNum); return 0; } ``` 以上就是使用C语言生成随机数的两常用方法。 ### 回答3: 在C语言中,我们可以使用`rand()`函数来生成随机数。首先,我们需要包含C标准库`stdlib.h`头文件。 要生成随机数,我们需要在使用`rand()`函数之前使用`srand()`函数来设置随机数子。我们可以使用当前时间作为子,这样每次程序运行时生成的随机数序列都不同。 下面是一个示例代码: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int i; // 设置随机数子为当前时间 srand(time(NULL)); // 生成10个随机数 for (i = 0; i < 10; i++) { int random_num = rand(); printf("%d\n", random_num); } return 0; } ``` 在上面的代码中,我们使用`srand(time(NULL))`来设置随机数子,其中`time(NULL)`函数获取当前时间。然后,使用`rand()`函数来生成随机数,并打印出来。这样,每次运行程序时都会生成一串不同的随机数。 需要注意的是,`rand()`函数生成的是一个伪随机数序列,它是根据一个初始子生成的,子相同则生成的随机数序列也相同。因此,在使用`rand()`函数前设置不同的随机数子是生成不同随机数序列的一方式。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值