一个很有意思的现象不知道为什么。。关于随机数的

MagicFuzzX 2012-03-21 01:38:47
我想产生一个随机的16进制的字符串


char szSerNum[16];
for (ULONG i = 0; i < 100; i++)
{
sprintf_s(szSerNum, 14,"%08X%05X",rand(), rand()%0xFFFFF);
printf("%s \n",szSerNum);
}
getchar();


这里产生的100个字符串确实都不一样,但是,为什么,每次运行程序再关闭,产生的都是一样的呢,如下图

三次运行,产生都是一样的。。。

...全文
225 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
jamseyang 2012-03-23
  • 打赏
  • 举报
回复
以前也遇到过的,stl中的random_shuffle也是这样的
jamseyang 2012-03-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 magicfuzzx 的回复:]
明白了。。

来句就可以了
C/C++ code
time_t t;
srand((unsigned)time(&t));
[/Quote]

up,stl中的random_shuffle也是类似了
gameslq 2012-03-23
  • 打赏
  • 举报
回复
搞定没?
Kaile 2012-03-23
  • 打赏
  • 举报
回复
srand(...);
要先设置种子,种子不一样,种出来的随机数才不一样
许文君 2012-03-23
  • 打赏
  • 举报
回复
电脑产生的是伪随机,所以需要时间种子来避免重复。
向立天 2012-03-23
  • 打赏
  • 举报
回复
200分
伪随机数
呵呵
hztj2005 2012-03-23
  • 打赏
  • 举报
回复
计算机程序的本质特点就是可重复性。
Lactoferrin 2012-03-22
  • 打赏
  • 举报
回复
种瓜得瓜种豆得豆
gold_water 2012-03-21
  • 打赏
  • 举报
回复
wliaoc 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 gusto 的回复:]
引用 8 楼 fly4free 的回复:
为什么要先“播种”呢?


因为电脑不是真正的‘随机’的东西。。我们叫他怎么做就怎么做,设计rand()的程序员也是固定写好了程序,这程序有个起点。。你不设置起点,就是同一个起点,所有得到的‘随机’数都一样。

产生整数rand的原理是:
y=ax+b(mod n)其中,n一般是一个很大的素数,几万。
a也是大素数。而且a,b,n都……
[/Quote]

支持啊,rand函数的输出是固定的,接分
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 mwj_88 的回复:]
我又来打广告了,确实没人回答我的问题啊啊啊啊啊啊http://topic.csdn.net/u/20120321/09/2618e648-b1b3-42a3-ad5d-f45264fc5942.html哪位大神有空帮我解答下呗
[/Quote]求解答求解答
快乐鹦鹉 2012-03-21
  • 打赏
  • 举报
回复
  • 打赏
  • 举报
回复
我又来打广告了,确实没人回答我的问题啊啊啊啊啊啊http://topic.csdn.net/u/20120321/09/2618e648-b1b3-42a3-ad5d-f45264fc5942.html哪位大神有空帮我解答下呗
AthlonXP1800plus 2012-03-21
  • 打赏
  • 举报
回复
ls上的已经回答很清楚了,rand是伪随机函数,你在程序中使用的时候,他每次的初始值是一样的,由于同样的计算方法,所以经过同样的步骤只能产生同样的结果了。
你可以srand函数随机设置一个初始值,一般都是用时间做为随机种子。
gordonwu151 2012-03-21
  • 打赏
  • 举报
回复
你产生的是伪随机数,也就是程序运行一次之后,伪随机数就确定不会改变了。。加句这个就行了:time_t t;
srand((unsigned)time(&t));
ystemni 2012-03-21
  • 打赏
  • 举报
回复
嗯。补充下,那句话执行一次就够了,千万别在一个循环中执行N次……
oyljerry 2012-03-21
  • 打赏
  • 举报
回复
缺省是伪随机系列,所以一般要先加个时间的随机
gusto 2012-03-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 fly4free 的回复:]
为什么要先“播种”呢?
[/Quote]

因为电脑不是真正的‘随机’的东西。。我们叫他怎么做就怎么做,设计rand()的程序员也是固定写好了程序,这程序有个起点。。你不设置起点,就是同一个起点,所有得到的‘随机’数都一样。

产生整数rand的原理是:
y=ax+b(mod n)其中,n一般是一个很大的素数,几万。
a也是大素数。而且a,b,n都是常数。所以rand的产生决定于x,
他被称为seed(种子)
每一个seed都是上一次产生的y的函数。这样,如果直接取seed=y的话,
虽然产生的rand之间相关性甚小,但只要知道某个y,就能推知以后的rand。
为避免这种情况,一般取seed为y和当时计算机的时间的函数,如seed=y+t

系统里的随机数是利用初等数论中的同余定理来实现的.

比如VC中对于rand()函数是如下实现的.
int __cdecl rand (void)
{
return(((holdrand = holdrand * 214013L + 2531011L) >> 16) & 0x7fff);
}

fly4free 2012-03-21
  • 打赏
  • 举报
回复
为什么要先“播种”呢?
ouyh12345 2012-03-21
  • 打赏
  • 举报
回复
加载更多回复(6)

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧