科普知识伪随机 - 不要再“伪定义”了
暗黑破坏神吧
全部回复
仅看楼主
level 11
QQ_FlashDance 楼主
“伪随机”是指计算机中的随机函数是按照一定算法模拟产生的,其结果是确定的,是可见的,这个结果其出现的概率是100%。Random函数是以时间“毫秒”级做为基础参数计算得来的结果,就是说如果按当时情形重来一次,结果依然固定不变。
计算机中“伪随机”之代码解释(Delphi版):
假如想在0~99的整数之间得到任意“随机”数值
可用Random(100)函数来取得
代码如下:
var
I:Integer;
begin
Randomize;
I:=1+Random(100);
ShowMessage(IntToStr(I));
end;
“Randomize”是重点,它是以计算机当前时间(毫秒级)来初始化随机种子“RandSeed”的
原型为:
procedure Randomize;
{$IFDEF MSWINDOWS}
var
Counter: Int64;
begin
if QueryPerformanceCounter(Counter) then
RandSeed := Counter
else
RandSeed := GetTickCount;
end;
也可以不用当前时间为种子,而自行指定随机种子“RandSeed”,
这样就非常明显的看到并证实了了计算机中的“伪随机”是怎样工作的
任意指定随机种子值,如果是12,那么结果就必为38;如果指定种子为13,结果必为41;代码如下:
var
I:Integer;
begin
RandSeed:=12;
I:=1+Random(100);
ShowMessage(IntToStr(I));
end;
2013年05月17日 13点05分 1
level 14
不明觉厉[揉脸]
2013年05月17日 13点05分 2
level 12
知识贴要顶[顶]
2013年05月17日 13点05分 3
吧务
level 17
伪随机这词最早怎么开始流行的?
2013年05月17日 13点05分 4
貌似MF过程中常常掉落相似物品时出现的
2013年05月17日 13点05分
分享适合Mf地图那个帖子后出来的。顺便求炸16楼的楼中楼
2013年05月17日 15点05分
seed的产物?
2013年05月18日 05点05分
level 15
[呵呵]本来就是吧里用来扯了个蛋的说法 何必较真呢
2013年05月17日 13点05分 5
[勉强]一开始确实是这样的,后来被误导的人多了
2013年05月17日 13点05分
level 14
图片来自:B_b_的百度相册
2013年05月17日 13点05分 6
2013年05月17日 14点05分
逼太紧[喷]难道要松的[滑稽]
2013年05月17日 14点05分
回复 chzh0016 :人都是逼出来的[]
2013年05月17日 14点05分
[滑稽]
2013年05月17日 14点05分
level 13
科普帖留名
2013年05月17日 14点05分 7
level 12
[勉强]虽然不玩了,不过作为一个用了楼主的完美收藏版,MAPEASY的人来说 不得不怒顶啊。没记错吧,应该是楼主的。
2013年05月17日 14点05分 8
[吐舌]
2013年05月17日 14点05分
秃头连游戏都不玩了啊,这是什么节奏[]
2013年05月17日 14点05分
回复 小虾囧 :[冷]因为在一股邪恶力量:MZ的压迫下。。。我不能玩了。。。不过游戏还在 偶尔可以偷偷回味一下哈哈
2013年05月17日 14点05分
level 13
这个貌似不是C语言啊。。。
2013年05月17日 14点05分 9
最终底层API都是一样的,只要是“真编译语言”最终都编译成汇编并且转化成机器码
2013年05月17日 14点05分
原来如此[拜]
2013年05月17日 14点05分
这个是pascal……Delphi是pascal的一种面向对象的编程环境吧
2013年05月17日 14点05分
回复 黑衣死士 :[胜利]是啊
2013年05月17日 14点05分
level 15
没读懂程序
2013年05月17日 14点05分 10
Random(N)函数中的“N”是参数,N为>=0的正整数,可指定,函数结果是在0~(N-1)中取得随机整数
2013年05月17日 14点05分
回复 QQ_FlashDance :那个12—38 13—41是咋算滴?求解答?[疑问][乖]
2013年05月17日 14点05分
回复 cfb0214 :这要列出函数源码了,要大篇幅详细解释才行。其实就是函数有固定算法,给函数指定参数和RandSeed,就可以使用这2项进行计算,结果是固定的。
2013年05月17日 14点05分
回复 QQ_FlashDance :。。。。。。虽然上学时候就知道random()有问题,但对我来说果然还是太深了
2013年05月17日 14点05分
level 13
不明觉厉。另外我一直觉得伪随机其实是给脸丑挡枪用的[haha][滑稽][胜利]
2013年05月17日 14点05分 12
[大拇指]
2013年05月17日 14点05分
[滑稽]
2013年05月17日 14点05分
血淋淋的事实啊
2013年05月18日 11点05分
level 15
2013年05月17日 14点05分 13
level 15
相对论吧....
2013年05月17日 14点05分 14
level 14
[真棒]好评
2013年05月17日 14点05分 15
level 11
比如英雄无敌5(好像3也是),理论上每个英雄每次升级可以学的4个技能是随机的,但其实在这个英雄生成的时候,他今后的升级路线就完全确定好了,不管如何sl都不会改变,这就是伪随机。
2013年05月17日 14点05分 17
这样就又被伪定义了,其实那只是算法,和伪随机无关
2013年05月17日 14点05分
回复 QQ_FlashDance :你这说法太片面了,用时间来作为种子取得随机数,只是伪随机的一种方式,又不是全部,根据上一个随机数的结果作为种子,乃至于前面若干个随机数的值作为种子,来生成下一个随机数,也是伪随机的一种。这种情况下,对游戏来说只要保持操作步骤玩下去,
2013年05月17日 18点05分
不论SL多少次游戏发展顺序都不会变,而且有时不变性。H5没玩过,H3确实如上所说,SL多少次该出垃圾技能的还是垃圾,根本不会变。你说那叫算法,不叫伪随机,那伪随机也是一种算法啊。
2013年05月17日 18点05分
但是也没一出生就确定那么夸张,我记得只要回到上一次升级的存档选择另一个技能,下一次升级就跟着变化了。
2013年05月17日 19点05分
吧务
level 13
吧里所谓伪随机太泛滥了。。[汗]纯属脸黑
不过完全说精确到毫秒也不是太准确。。。这个只有暴雪程序员知道。。只是目前只是不清楚暴雪的SEED到底以什么为基准 。。时间理论上应该是绝大部分随机调用的SEED。实际上如果地图的SEED也应该是随机生成的
不过貌似总体看来地图SEED还是有一定影响
猜想是也许某些判定调用了地图的SEED。。。不过这个也没法证明。。[飘过]
2013年05月17日 14点05分 19
问题是地图seed似乎不换难度就不变[揉脸]所以会有一些奇怪的事情
2013年05月17日 14点05分
回复 ry_x :[滑稽]脸黑挡枪专用借口
2013年05月17日 14点05分
求知道帝都是怎么随机生成的。。。游戏不可能自带地图的资料库的吧。。。难道是根据某个不确定的值来生成符合逻辑的地形吗?
2013年05月17日 14点05分
windows平台的底层API决定了Random都是以GetTickCount来决定的。如果使用地图seed做随机函数的种子,那么每局必然完全相同:怪物分布、每击的伤害值、掉落……,都将完全相同。地图seed只有在使用“ -seed”参数时才有影响,这是在游戏开始时,用地图种子初始化变量造成的,但之后还是时间种子
2013年05月17日 14点05分
level 11
不少人都望文生义,无可厚非,这三个字固然有具体的定义,
lz
的例子举得不错
2013年05月17日 14点05分 20
level 13
话说dnf的异界副本的设定是特定的几个怪物比报特殊装备(每个怪能报的装备种类很多)
但是看到在一定时间内(15分钟左右)必定只报特定几个职业的装备
也就是说,在一定时间内只会报
如果说,A类的第三个职业称之为A3
那么,在一定时间内
爆出A1,B1,C1,D1的装备几率非常大
而在另一段时间内A2,B2,C2,D2的装备几率就会很高
但是爆出来的装备部位却是很随机的,应该是跟时间无关
求知道这是怎样的原理。。。
2013年05月17日 14点05分 21
这是算法,随机还是与时间相关的。可以用数组来保存大量数据,如:Array[0]~Array[100]保存15分钟出装, Array[101]~Array[200]保存30分钟出出装。Random(101)取值为0~100(15分钟时算法)、100+Random(101)取值为100~200(30分钟算法)。
2013年05月17日 15点05分
原来是这样[揉脸]
2013年05月18日 04点05分
level 13
不明觉厉,后排围观。
2013年05月17日 14点05分 22
1 2 尾页