现在的位置: 首页 > 综合 > 正文

实现随机抽样【随机数生成问题】

2013年06月30日 ⁄ 综合 ⁄ 共 1439字 ⁄ 字号 评论关闭

参考资料:C语言函数库

1、rand()

定义:

         int rand(void);

返回值:返回一个伪随机数,该数的范围是:[0,RAND_MAX)

2、srand()

定义:

     void srand(unsigned int seed);

返回值:该函数是随机数发生器的初始化函数;如果使用相同的种子给rand用,那么rand()会产生相同的伪随机数。常用的用法如下:

(1) srand((unsigned)time(&t));(2) srand((unsigned)time(NULL));这两个都是用当前时间去初始化种子;

(3) srand((int)getpid());使用程序的PID来作种子,那么在这个程序运行时种子固定那个。

3、实战经验

(1)使用math.h中的函数floor时报如下错误,经查是没有指定链接库。使用gcc -o randint randint.c -lm即可

相关讨论:点击打开链接


(2)采用下面这个例子,生成随机数,如果个数多了,偶尔会有重复的值

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

#define NUMBER_MAX 100

int main(int argc,char* argv[])
{
    int num[NUMBER_MAX];
    int i;
    FILE *rand_num_file = fopen("rand_num_file.txt","w+");
    srand((unsigned)time(NULL));
    for( i=0; i<100; i++)
    {
        num[i] = rand()%900 + 100;
        fprintf(rand_num_file,"%d\n",num[i]);
    }

    return 0;
}

(3)Makefile的学习刻不容缓,十一之后来了主攻《git权威指南》和《shell编程学习指南》

(4)按照网上的一种解法,实现randint和bigrand:用rand实现bigrand和randint

仍然会有重复的数值,那么我们怎么解决这个问题呢?我们要的是100~999之间的任意100个随机数,要求不能重复!

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

#define NUMBER_MAX 100

int randint(int l, int u);

int main(int argc,char* argv[])
{
    int num[NUMBER_MAX];
    int i;
    FILE *rand_num_file = fopen("rand_num_file.txt","w+");
    srand((unsigned)time(NULL));
    for( i=0; i<100; i++)
    {
        //num[i] = rand()%900 + 100;//生成[100,999)之间的随机数
        num[i] = randint(100,1000);
        fprintf(rand_num_file,"%d\n",num[i]);
    }

    return 0;
}

//实现randint(l,u),返回[l,u]范围内的一个随机整数
int randint(int l,int u)
{
    int temp;
    temp = floor(l + (1.0*rand()/RAND_MAX)*(u - l + 1 ));
    return temp;
}

补上:

今天看到用java语言生成随机数,有这么一个想法,也能满足我们的要求:生成[n,m]之间的k个不重复的随机数。参见:点击打开链接

抱歉!评论已关闭.