C语言和java中生成随机数的原理和方法

C语言

一.函数
1:int rand(void)
该函数会产生一个[0,RAND_MAX]的伪随机数,那什么是伪随机数?
相当于一个序列a1-an,第一次使用会返回a1, 第二次使用会返回a2….第n次返回an,这样每次调用rand()都能产生一个不同的数,只要整个序列的规律不明显,整个函数看起来就是随机的。
而这个序列是计算机通过调用srand((int)time(NULL))函数随机产生的。

2:void srand(unsigned seed)

srand((unsigned)time(NULL))则使用系统定时/计数器的值作为随机种子。每个种子对应一组根据算法预先生成的随机数序列,所以,在相同的平台环境下,不同时间产生的随机数会是不同的。如果该函数的参数是一个常数,那么每次生成的随机数序列都是固定的。
二.函数使用
1.标准使用:

# include <stdio.h>
# include <stdlib.h>
# include <time.h>

int main(void)
{
    srand((int)time(NULL));
    printf("%d\n",RAND_MAX);
    for(int i = 0; i<5; i++)
    {
        printf("%d\n",rand());
     }  
    return 0;
}

结果:

2:如果你想产生在[0, 32767]范围内的一个范围的随机数,可以这样:

# include <stdio.h>
# include <stdlib.h>
# include <time.h>

int main(void)
{
    int n;
    srand((int)time(NULL));
     printf("你想生成随机数的最大值是多少?\n");
     scanf("%d",&n); 
    for(int i = 0; i<5; i++)
    {
        printf("%d\n",rand()%n);
     }  
    return 0;
}

结果:


3.如果你还不满足n的范围,可以这样(缺点:n太大精度不好):

# include <stdio.h>
# include <stdlib.h>
# include <time.h>

int main(void)
{
    int n;
    srand((int)time(NULL));
     printf("你想生成随机数的最大值是多少?\n");
     scanf("%d",&n); 
    for(int i = 0; i<5; i++)
    {
        double t =(double)rand()/32767;//产生一个[0,1]内的随机数
        double c = t*n;//将他变成你想要的范围
        printf("%d\n",(int)c);
     }  
    return 0;
}

结果:

三.注意:
1.srand()函数是用来初始化随机数种子的,种子决定序列,种子相同,序列也就相同,每次产生的随机数也就相同,而且srand()只需要执行一次,不要在程序中多次使用它,防止产生相同的随机数。
2.关于time_t time(0):time_t被定义为长整型,它返回从1970年1月1日零时零分零秒到目前为止所经过的时间,单位为秒。
3.如果在程序中没有使用srand()函数,那么系统会默认给种子初始为0,所以每次产生的随机数序列都是一样的,这个要注意。

Java

一:函数
1.Math.random()
该函数会默认生成[0,1)内的随机数,注意1不闭合。所以你要产生某一范围内的随机数就要最后加上1.
二:函数的使用

public class Main {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        System.out.println("你想要的范围最大数:");
        java.util.Scanner input = new java.util.Scanner(System.in);
        double n= input.nextDouble();
        for(int i = 0; i<5; i++)
        {
            System.out.println(Math.random()*n+1);
        }
    }
}

结果:
这里写图片描述
这里写图片描述
3.java很方便吧

发布了27 篇原创文章 · 获赞 8 · 访问量 3万+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章