方法一:

# echo $RANDOM

24215

生成0-32767之间的整数随机数,若超过5位可以加个固定10位整数,然后进行求余。

 

方法二:

/dev/random & /dev/urandom

这两个特殊设备都是字符型设备。我们可以在用户空间通过read系统调用读这两个设备文件以此获取随机数。这两个设备文件的区别在于:如果内核熵池的估计值为0时,

/dev/random将被阻塞,而/dev/urandom不会有这个限制。

linux内核将机器的物理硬件产生的噪声等(例如发生的键盘敲击,中断次数,频率,温度等等)放入系统的熵池/dev/random 和/dev/urandom 中放的就是熵池中的部分随机数据,/dev/random 里只放入熵池中达到一定熵值的情况,例如达到比较的高的熵值的情况,那个时候数据最混乱,所以读取/dev/random 中的随机数据时会阻塞(熵池中随机性也就是整体熵值达到一定程度才会在这里面有随机数据),但他的随机性能比/dev/urandom 更好点,/dev/urandom 已经可以满足对加密要求非常高需要随机数的场景了。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>

int main( int argc, char** args )
{
unsigned long* seed = malloc( sizeof( unsigned long ) );
FILE* file = fopen("/dev/random", "r");
printf( "%ld\n", sizeof( unsigned long ) );
int i;
for( i = 0; i < 9999; ++i)
{
fread( seed, 1, sizeof( unsigned long ), file );
printf( "%ld\n", *seed );
}
return 1;
}

运行结果:

# ./a.out 
8
-1840780026009950708
5537800552867395957
7966537826196495960
-1815376459547872445
-5676317176331093240
-1996660048898453941
-4427757671846050231
-9123524267935371512
6211891415361813436
-696863207697087864
-120099146402446492
3448015127454821311

/dev/random:不能一直读,会阻塞

/dev/urandom:可以一直读

 

方法三:

#include <stdlib.h>
int rand(void);
int rand_r(unsigned int *seedp); //不要用这个,这个只能提供几个随机,很不实用
void srand(unsigned int seed); //放入随机种子

/* 可重入的函数 */
int drand48_r(struct drand48_data *buffer, double *result);

int erand48_r(unsigned short xsubi[3],
struct drand48_data *buffer, double *result);

int lrand48_r(struct drand48_data *buffer, long int *result);

int nrand48_r(unsigned short int xsubi[3],
struct drand48_data *buffer, long int *result);

int mrand48_r(struct drand48_data *buffer,long int *result);

int jrand48_r(unsigned short int xsubi[3],
struct drand48_data *buffer, long int *result);

int srand48_r(long int seedval, struct drand48_data *buffer);

int seed48_r(unsigned short int seed16v[3],
struct drand48_data *buffer);
int lcong48_r(unsigned short int param[7],
struct drand48_data *buffer);

实例代码:

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

int main(int argc, char **argv)
{
int i = 0, val = 0;

/* if (argc != 2)
{
printf("usage: %s num\n", argv[0]);
return -1;
}
*/
printf("RAND_MAX = %d.\n", RAND_MAX); // 2147483647

//srand(atoi(argv[1]));
srand(time(NULL));
for (i=0; i<6; i++)
{
val = rand();
printf("%d ", (val % 6));
}
printf("\n");

return 0;
}