十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
rand(产生随机数)
发展壮大离不开广大客户长期以来的信赖与支持,我们将始终秉承“诚信为本、服务至上”的服务理念,坚持“二合一”的优良服务模式,真诚服务每家企业,认真做好每个细节,不断完善自我,成就企业,实现共赢。行业涉及成都软装设计等,在成都网站建设、网络营销推广、WAP手机网站、VI设计、软件开发等项目上具有丰富的设计经验。
表头文件: #includestdlib.h
定义函数 :int rand(void)
函数说明 :
因为rand的内部实现是用线性同余法做的,他不是真的随机数,只不过是因为其周期特别长,所以有一定的范围里可看成是随机的,rand()会返回一随机数值,范围在0至RAND_MAX 间。在调用此函数产生随机数前,必须先利用srand()设好随机数种子,如果未设随机数种子,rand()在调用时会自动设随机数种子为1。rand ()产生的是假随机数字,每次执行时是相同的。若要不同,以不同的值来初始化它.初始化的函数就是srand()。
返回值:
返回0至RAND_MAX之间的随机整数值,RAND_MAX的范围最少是在32767之间(int),即双字节(16位数)。若用unsigned int 双字节是65535,四字节是4294967295的整数范围。
0~RAND_MAX每个数字被选中的机率是相同的。
范例:
/* 产生介于1 到10 间的随机数值,此范例未设随机数种子,完整的随机数产生请参考
srand()*/
#includestdlib.h
main()
{
int i,j;
for(i=0;i10;i++)
{
j=1+(int)(10.0*rand()/(RAND_MAX+1.0));
printf("%d ",j);
}
}
执行:
9 4 8 8 10 2 4 8 3 6
9 4 8 8 10 2 4 8 3 6 //再次执行仍然产生相同的随机数
class RandGentor
{
int rk;
public:
RandGentor() { srand(0); }
void srand(int nRandSeed)
{
rk = nRandSeed; // 设置随机种子
}
unsigned short rand()
{
rk = 25173 * rk-1 + 13849 ;
return rk % 100; // 生成一到两位随机数
}
}
1. 优先:如果数字是保证永不重复,这不是很随机的。 第二:有很多的PRNG算法。 更新: 第三:有一个IETF的RFC的UUID(什么MS调用的GUID),但你应该认识到,(U|G)的UID不加密保护,如果这是你的关注。 更新2: 如果你想喜欢这种在生产代码(不只是为自己的熏陶),请使用预先存在的库。这是代码的那种几乎保证有微妙的bugs,如果你之前(或者即使你有)从来没有做过。 更新3: 下面是文档的.NET的GUID
2. 有很多方法可以生成随机数。这是一个系统/库调用一个伪随机数发生器的seed照你已经描述。 但是 CodeGo.net,也有越来越随机数的其他方式涉及专门的硬件来获得真正的随机数。我知道扑克网站这种硬件的。这是非常有趣的阅读他们是如何做到这一点。
3. 大多数随机数发生器有办法“随机”重新初始化seed值。 (称为随机化)。 如果这是不可能的,你可以将系统时钟初始化seed。
4. 你这个代码示例: 或者,您这本书: 但是,不要自己动手,用现有的库。你不能成为优先人做到这一点。
5. 特别是关于Java的:java.util.Random使用线性同余发生器,这不是很好java.util.UUID#randomUUID()用途java.security.SecureRandom,适用于各种加密安全随机数据生成器的界面-默认是基于SHA-1的,我相信。 的UUID / GUID是不一定随机 人们很容易找到那些比好得多的RNG的java.util.Random如Mersenne扭曲或乘用携带
6. 我知道你正在寻找一种方法来生成随机的C#。如果是的话,RNGCryptoServiceProvider的是你在找什么。 [编辑] 如果产生一个相当长的RNGCryptoServiceProvider的数目,它很可能是唯一的,但不存在供货保证。从理论上讲,真正的随机数是唯一的。你滚骰子2,你可能会得到两个头的,但他们仍然是随机的。真正的随机! 我想申请的是unique的支票,你只需要保持滚动生成的数字历史你了。
这题你可以直接全部算就行了,要记录下每一次算出来的结果,如果算出来的结果是已经产生过的,那就证明陷入循环了,不能产生所以的0~m-1的数,如果全部找到都还没有算出重复的,那就说明可以产生所有数