c语言产生随机数的问题

问题描述

c语言产生随机数的问题

#include
#include
int main(){
int a=rand();
printf("%dn",a);
return 0;
}
这段代码每次产生的数字是相同的,为啥不是随机的,查了一下,是说需要一个函数来产生一个种子,srand()函数到底是怎么产生随机数种子的,求讲解,谢谢。

解决方案

rand()的机制其实是计算机内部通过一个“种子”来进行一系列的复杂的计算最终生成一个N(具体多少位忘了,好像是13位吧)位长的数,这个数本质上不是随机的,因为他的“种子”是固定的。
所以,如果你想得到一个随机的数的话,那么你的“种子”必须是随机的,你要埋下一个随机“种子”,如何埋一个“种子”,你查查srand()的用法。
或许你会问,如何得到一个随机的“种子”呢?其实很简单,你可以把当前时间当成“种子”埋下去,因为当前时间是不停的在变,你把当前的时间当成“种子”埋下去,经过一系列的复杂计算,所得到的数,就是一个不可预测的N位随机数了,然后你可以通过取余算法来获得你想要的区间的随机数。

解决方案二:

 #include<time.h>
int main()
{
    int i;
    srand((int)time(NULL));     //每次执行种子不同,生成不同的随机数
int a=rand();
printf("%dn",a);
        return 0;
}

解决方案三:

相同的种子产生相同的数。
用时间作为种子才能产生不同的随机数。

解决方案四:

http://baike.baidu.com/link?url=UkuIIqdTDZDssWWNWotaP9kDXavGidjK60V6fcBkeih8Oee9vQopeUfWs2htxHLRgjMMPdLMUiCmQLsyaOueVa
这里面已经很详细了

解决方案五:

这段代码每次产生的数字是相同的,为啥不是随机的,查了一下,是说需要一个函数来产生一个种子,srand()函数到底是怎么产生随机数种子的

解决方案六:

这段代码每次产生的数字是相同的,为啥不是随机的,查了一下,是说需要一个函数来产生一个种子,srand()函数到底是怎么产生随机数种子的

解决方案七:

rand()函数产生的是伪随机数,即用一个种子(seed)产生的序列,linux下的rand是用类似下面的代码实现的:

 static unsigned long next = 1;

/* RAND_MAX assumed to be 32767 */
int myrand(void) {
    next = next * 1103515245 + 12345;
    return((unsigned)(next/65536) % 32768);
}

void mysrand(unsigned seed) {
    next = seed;
}

rand()返回值是一个可以通过seed计算出来的序列,每次调用rand()时它会返回序列里的下一个元素的值。当然第一次调用时返回的是序列里第1个元素的值。

如果你没有调用srand设置随机数种子,seed的默认值会是0,而seed为0时所决定的序列是固定的,而第一次调用rand()就是返回这个固定序列里的第1个元素,那它的值也是固定的,自然你的程序每次输出都一样了。

所以正确的写法应该是程序初始化时用srand设置不同的随机数种子(只需要设置一次),例如srand(time(NULL)),但要注意,time(NULL)的值是隔1秒才改变一次的。

下面这段程序,只要你不是在同一秒内执行两次,每次输出结果都是不一样的:

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

int main()
{
    srand(time(NULL));     // 设置随机数种子
    for (int i = 0; i < 10; i++)
    {
        printf("%un", rand());
    }
    getchar();
    return 0;
}

解决方案八:

这段代码每次产生的数字是相同的,为啥不是随机的,查了一下,是说需要一个函数来产生一个种子,srand()函数到底是怎么产生随机数种子的

解决方案九:

种子一样的,得到的结果也就一样

解决方案十:

参考代码
https://github.com/707wk/Senior-middle-school/blob/master/20140404001.c

时间: 2024-10-24 16:49:14

c语言产生随机数的问题的相关文章

输出-C语言 产生随机数并判断是否连续

问题描述 C语言 产生随机数并判断是否连续 扑克牌2,3,4--10,J,Q,K,A十三张牌,4个花色,以及大小王组成54张牌,用C语言从中抽取5张牌,要求不能重复数字,不能少,不能是大小王. 将上述随机产生的数输出到文件output.txt中 判断上述随机抽取的牌是否为顺子 将排序结果追加输出到output.txt文件中 不求完整答案,提供一些思路或部分答案也好,重谢~ 解决方案 以下是:C语言下生成5个不重复随机数(指定范围)并排序,其它的写文件之类的,就自己去改吧. #include <s

用c语言产生随机数总结

 在C语言中,rand()函数可以用来产生随机数,但是这不是真真意义上的随机数,是一个伪随机数,是根据一个数,我们可以称它为种子,为基准以某个递推公式推算出来的一系数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数,当计算机正常开机后,这个种子的值是定了的,除非你破坏了系统,为了改变这个种子的值,C提供了srand()函数,它的原形是void srand( int a). 可能大家都知道C语言中的随机函数random,可是random函数并不是ANSI C标准

linux下的c语言的随机数算法代码

在linux下取随机数,当然可以简单的用rand函数,不过要注意的是一定要设置好种子,否则伪随机数就会变成非常伪的随机数.设置种子,一般就用time函数返回当前时间即可.一般来讲,这样的做法基本上就可以了,因为虽然我们用的是随机数,但是由于种子不同,从上亿的数中去猜测我们的种子几乎是不可能的. 但是如果我们的种子算法被知道了,那么显然就不行了.当然作为某些应用也无所谓,比如我们要在屏幕上随机的画一只小猪.这样的应用几乎不会有谁会去关心下一次会是什么结果.不过有些应用就不一样了,大的不说,就是一些

c语言-代码随机数不变,总是那几个怎么改

问题描述 代码随机数不变,总是那几个怎么改 #include #include int main() { int a[20],i; int b; int c; printf("请输入随机数范围!"); scanf("%d",&b); printf("清输入随机数个数!"); scanf("%d",&c); for(i=0;i<c;i++) { a[i]=1+rand()%b; printf("%

c语言-C语言中如何产生随机数

问题描述 C语言中如何产生随机数 C语言中如何产生两数之间的随机数,具体代码和函数说明...................... 解决方案 int value = rand() % (MAX + 1 - MIN) + MIN; 产生min~max之间的随机数 解决方案二: C语言中如何产生两数之间的随机数,如:产生从min~max之间的数 头函数:include include 实现代码:int rand=min+rand()%(max+1-min): 说明: rand() :该函数随机产生非

C/C++产生随机数函数简单介绍_C 语言

计算机的随机数都是由伪随机数,即是由小M多项式序列生成的,其中产生每个小序列都有一个初始值,即随机种子.(注意: 小M多项式序列的周期是65535,即每次利用一个随机种子生成的随机数的周期是65535,当你取得65535个随机数后它们又重复出现了.)  我们知道rand()函数可以用来产生随机数,但是这不是真正意义上的随机数,是一个伪随机数,是根据一个数(我们可以称它为种子)为基准以某个递推公式推算出来的一系列数,当这系列数很大的时候,就符合正态公布,从而相当于产生了随机数,但这不是真正的随机数

C语言中用于产生随机数的函数使用方法总结_C 语言

在UNIX操作系统和window的操作系统上,我们知道有一个函数rand,它就是用来产生随机数的函数API接口,那么它的原理如何实现? 如果约定a1=f(seed),an+1=f(an),那么可以得到一个序列a1,a2,a3..an,那么要制作一个伪随机函数rand,只需要让它每调用一次就返回序列的下一个元素就行.其实就是相当于第1次调用rand返回a1,第2次返回a2,-,第n次返回an,这样每次返回的数值都不一样,也就是相当于随机数了.但是其实不是真正的随机数,真正的随机数是使用物理现象产生

C语言编程中生成随机数的入门教程_C 语言

语言产生随机数是一个常见的编程功能任务,当然这个也不难,调用两三个函数就出来了,但是你知道这些函数具体是起到怎样的作用,并且是它们是如何产生随机数的吗? 几个概念 随机数:数学上产生的都是伪随机数,真正的随机数使用物理方法产生的. 随机数种子:随机数的产生是由算术规则产生的,srand(seed)的随机数种子不同,rand()的随机数值就不同,倘若每次的随机数种子一样,则rand()的值就一样.所以要产生随机数,则srand(seed)的随机数种子必须也要随机的. 用srand()产生随机数种子

C++编写生成不重复的随机数代码_C 语言

C++编写生成不重复的随机数代码 vector<int> getRandom(int total) { srand((int)time(NULL)); std::vector<int> input = *new std::vector<int>(); for (int i = 0; i < total; i++) { input.push_back(i); } vector<int> output = *new vector<int>();