原文地址::http://blog.sina.com.cn/s/blog_6e4728e50100zbcl.html
相关文章
1、linux产生随机数----http://blog.csdn.net/imxiangzi/article/details/7710982
2、linux shell实现随机数多种方法(date,random,uuid)----http://www.cnblogs.com/chengmo/archive/2010/10/23/1858879.html
ZZ: http://aijiekj.blog.163.com/blog/static/129866789201121511304912
随机数
当我们听到这个词时,第一个听到应该是C中的rand()函数吧!我也是这样的,下样就一个关于这产生随机数的小例子:
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
}
当我编译运行时,他的运行结果都是一样的,例如下面的运行结果:
FreeOS@FreeOS:~/source/test$ ./rand
FreeOS@FreeOS:~/source/test$ ./rand
我们来看看为什么会出现这样的结果吧!!
先看看他的定义:
返回值
通过看他的函数说明我们可以了解到要想每次运行得到的随机数不同,我们还要设置随机数种子。在这里我们还要注意一下rand()返回值的范围后面可能会用到这个知识点。
既然要设置随机数种子,那我们就看看如何设置吧!那我们先看看上面提到srand()这个函数,下面就是关于srand()函数的简要描述:
大体知道怎么用了吧!我们还是先看一个例子:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[])
{
}
我们再进行编译运行看看运行结果吧!
FreeOS@FreeOS:~/source/test$ gcc rand.c -o rand
FreeOS@FreeOS:~/source/test$ ./rand
FreeOS@FreeOS:~/source/test$ ./rand
运行结果是不是不同了,但是我们我们怎么利用这些这些随机数呢??这么大的数对我们来说也没有多大意义呀!是这样的,我们可对他进行范围化分,就可以产生我们想要范围内的数。那我们就开始吧!
提前声明下面的这段文字来自己网络,摘自:http://blog.csdn.net/Chris_Magic/archive/2010/10/21/5957350.aspx
产生一定范围随机数的通用表示公式
我们来年这样一个例子:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[])
{
}
再看看运行结果:
FreeOS@FreeOS:~/source/test$ ./rand
FreeOS@FreeOS:~/source/test$ ./rand
FreeOS@FreeOS:~/source/test$ ./rand
这个小例子主要是生成[0,26]之间的数,一会儿我会用这个小例子生成随机字符串。但是这里还要先说说这条语句“nu = 0 + (int)( 26.0 *rand()/(RAND_MAX + 1.0));”,有心的人会说,怎么和上面的通用公式有点出入呀???
如果我们使用通用公式的话,在编译程序时加上“—Wall”的话,就会看到下面的情况:
FreeOS@FreeOS:~/source/test$ gcc rand.c -o rand -Wall
rand.c: In function ‘main’:
rand.c:12: warning: integer overflow in expression(整数溢出在表达)
这就是为什么上面我你们注意rand()函数的返回值的范围了。
好了,随机数的问题就说完了,那我看看如果用随机数生成随机字符串吧!
下面就是一个自己小的小程序,代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
int main(int argc, char *argv[])
{
}
这 里提醒一句,如果没有bzero(buffer, 257);这条语句的话,可能生成的随机字符串中就会出现乱码的情况,这种情况多半是引用了未初始化的内存地址。这个小例子也只能生成小写字母的随机数, 要想生成其他的字符,就看你们的发挥了。如果有什么好的意见,喜欢大家能相互分享一下。
生成全字符随机的字串:
cat /dev/urandom | strings -n C | head -n L
生成数字加字母的随机字串:
cat /dev/urandom | sed 's/[^a-zA-Z0-9]//g' | strings -n C | head -n L
其中C表示字符串的字符数,L表示要生成多少行字符。
这两条命令可以生成随机字符串,大家可以试一下,也可以把他们放到程序中,这就看你对C的掌握了!