打印
[牛人杂谈]

C语言中随机函数应用

[复制链接]
1008|12
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
稳稳の幸福|  楼主 | 2016-3-28 21:42 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
可能大家都知道C语言中的随机函数random,可是random函数并不是ANSI C标准,所以说,random函数不能在gcc,vc等编译器下编译通过。那么怎么实现C语言中的随机函数呢?
除了random函数,还有一个rand函数,也是一个随机函数,可以产生从0到rand_max的随机数。
    #include <stdio.h>  
    #include <stdlib.h>  
    int main()  
    {  
    int k;  
    k=rand();  
    printf("%d\n", k);  
    return 0;  

    }  
大家可以把以上的代码编译运行一下,发现他的确产生随机数了,但是你会发现,每次运行程序产生的随机数都是一样的,为什么呢?因为随机数取在C语言中采用的是固定序列,所以每次执行所取的是同一个数。

那么如何写一个程序,让它每次运行时产生的随机数都不一样呢? 请看下面的例子:

#include <stdlib.h>  
    #include <stdio.h>  
    #include <time.h>  
    int main(void)  
    {  
    int i;  
    time_t t;  
    srand((unsigned) time(&t));  
    printf("Ten random numbers from 0 to 99\n\n");  
    for (i=0; i<10; i++)  
    printf("%d\n", rand()%100);  
    return 0;  
    }  
这时运行程序,会发现每次产生的随机数都不一样。

那么为什么第一个程序一样而第二个程序不一样呢?

第二个程序用到了一个新的函数srand,这个函数是给随机数产生一个随机种子(seed),函数原型是srand( (unsigned) time(NULL));

time的值每时每刻都不同。所以种子不同,所以,产生的随机数也不同。

所以说,要想产生不同的随机数,在使用rand之前需要先调用srand

由于rand产生的随机数从0到rand_max,而rand_max是一个很大的数,那么如何产生从X~Y的数呢?

从X到Y,有Y-X+1个数,所以要产生从X到Y的数,只需要这样写:

k=rand()%(Y-X+1)+X;

这样,就可以产生你想要的任何范围内的随机数了。

沙发
Micachl| | 2016-3-29 20:57 | 只看该作者
这个随机函数randm用于产生不相关噪声还是很有用的

使用特权

评论回复
板凳
稳稳の幸福|  楼主 | 2016-4-11 12:59 | 只看该作者
最近看到一个IBM卖了几百万的程序,就是个随机程序,让安检人员,随机选择通道的一个程序

使用特权

评论回复
地板
Beckham_Owen| | 2016-4-11 14:57 | 只看该作者
这rand函数在MATLAB里面用的比较多

使用特权

评论回复
5
稳稳の幸福|  楼主 | 2016-4-14 22:21 | 只看该作者
实现方法太多了。

使用特权

评论回复
6
zhuotuzi| | 2016-4-17 21:50 | 只看该作者
其实好多随机函数其实是不随机的,这跟抛硬币是不同的道理,抛硬币的行为是受很多因素影响,多了就显得有概率了,而计算机的随机,通常是从系统抽取变量,这个变量一般不是随机的,都是系统固定好的

使用特权

评论回复
7
734774645| | 2016-4-18 10:21 | 只看该作者
可以定义个时间函数,从中抽取变量。

使用特权

评论回复
8
稳稳の幸福|  楼主 | 2016-4-18 11:10 | 只看该作者
在标准的C库中函数rand()可以生成0~RAND_MAX之间的一个随机数,其中RAND_MAX 是stdlib.h 中定义的一个整数,它与系统有关。

使用特权

评论回复
9
zhuomuniao110| | 2016-4-18 21:36 | 只看该作者
前言:有些程序每次执行时不应该产生相同的结果,如游戏和模拟,此时随机数就非常有用。下面这两个函数合在一起使用能够产生伪随机数(pseudo-random  number):通过计算产生的随机数,可能有重复出现,所以并不是真正的随机数。

int   rand(void);

void  srand(unsigned  int  seed);

1>rand返回一个范围在0和RAND_MAX(至少为32767)之间的伪随机数。当它重复调用时,函数返回这个范围内其他数。为了得到一个更小范围的伪随机数,首先把这个函数的返回值根据所需范围的大小进行取模,然后通过加上或减去一个偏移量对它进行调整。

2>为了避免程序每次运行时获得相同的随机数序列,可以调用srand函数。它用它的参数值对随机数发生器进行初始化。

一个常用的技巧是使用每天的时间作为随机数产生器的种子(seed),例如:

srand((unsigned int )time(0));

2.实例:

程序一:

    #include<stdio.h>

    #include <stdlib.h>

    int main()

    {

    int k;

    k=rand();

    printf("%d\n", k);

    return 0;

    }

大家可以把以上的代码编译运行一下,发现他的确产生随机数了,但是你会发现,每次运行程序产生的随机数都是一样的,为什么呢?因为随机数取在C语言中采用的是固定序列,所以每次执行所取的是同一个数。

   那么如何写一个程序,让它每次运行时产生的随机数都不一样呢? 请看下面的例子:

#include<stdlib.h>

#include<time.h>

#include<stdlib.h>

Int  main(void)

{

      int  i;

srand((unsigned  int )time(0));

   printf("Tenrandom numbers from 0 to 99\n\n");

    for (i=0; i<10; i++)

    printf("%d\n", rand()%100);

    return 0;

}

   这时运行程序,会发现每次产生的随机数都不一样。

   那么为什么第一个程序一样而第二个程序不一样呢?

   第二个程序用到了一个新的函数srand,这个函数是给随机数产生一个随机种子(seed),函数原型是srand( (unsigned) time(NULL));

   time的值每时每刻都不同。所以种子不同,所以,产生的随机数也不同。

   所以说,要想产生不同的随机数,在使用rand之前需要先调用srand

   由于rand产生的随机数从0到rand_max,而rand_max是一个很大的数,那么如何产生从X~Y的数呢?

   从X到Y,有Y-X+1个数,所以要产生从X到Y的数,只需要这样写:

   k=rand()%(Y-X+1)+X;

   这样,就可以产生你想要的任何范围内的随机数了。

使用特权

评论回复
10
wahahaheihei| | 2016-4-18 22:13 | 只看该作者
如果有时间函数的话,可以每次去从时间函数抽取一个变量。

使用特权

评论回复
11
chenyongand| | 2016-5-1 01:41 | 只看该作者
楼主发帖子是好事,但是为什么老是重复内容呢?自己盖楼吗

使用特权

评论回复
12
cnb12345| | 2016-5-3 10:28 | 只看该作者

使用特权

评论回复
13
稳稳の幸福|  楼主 | 2016-5-15 11:07 | 只看该作者
chenyongand 发表于 2016-5-1 01:41
楼主发帖子是好事,但是为什么老是重复内容呢?自己盖楼吗

应该是捞积分的。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

181

主题

3252

帖子

8

粉丝