游戏制作者的irandom()的限制?

Limitation on irandom() of game maker?

我有三个对象。 create事件中都包含一个动作(执行一段代码):

obj_r01 => r01=0;

obj_r02 => r02=0;

obj_r03 => r03=0;

图片(澄清我试图解释的内容):

到目前为止一切顺利,但我还有一个对象可以修改其他三个的变量:obj_control

obj_control包含两个事件:createdraw

具体事件 (obj_control):

obj_r01.r01=irandom(9);
obj_r02.r02=irandom(9);
obj_r03.r03=irandom(9);

绘制事件 (obj_control):

这个事件包含三个动作,正好是三个"execute a piece of code":

一块:

draw_text(x,y,obj_r01.r01); => 适用于obj_r01

片二:

draw_text(x,y,obj_r02.r02); => 适用于obj_r02

片三:

draw_text(x,y,obj_r03.r03); => 适用于obj_r03

房间内物品排列如下:

在执行过程中会发生以下情况:

r01的值是随机的,但r02和r03的值不是。 我也试过修改obj_control创建事件代码为:

randomize();
obj_r01.r01=irandom(9);
randomize();
obj_r02.r02=irandom(9);
randomize();
obj_r03.r03=irandom(9);

然而结果并没有改变。有了这个我只能怀疑irandom ()函数只能创建一个可存储的随机值,它能解决这样的问题吗?


我尝试将 randomize() 仅放在代码的开头:

randomize();
obj_r01.r01=irandom(9);
obj_r02.r02=irandom(9);
obj_r03.r03=irandom(9);

但是结果没有任何变化

我还做了一个测试,以确定该值是否甚至没有被随机化,或者 r02 和 r03 的值是否被随机化为 0,为此我在创建每个值时修改了它们的值对象:

在obj_r02中:

r02=10

在obj_r03中:

r03=100

结果:

第一个值(毫不奇怪)是随机的,但第二个和第三个值不是。 因此很明显,在r02和r03随机化之前没有进行随机化或者抽奖事件发生

以下是我在 https://gamedev.stackexchange.com/

上收到的同一问题的答案

Link 问题 => https://gamedev.stackexchange.com/questions/139368/limitation-on-irandom-of-game-maker


GameMaker 使用的随机数生成器不是真正的随机数生成器。它是一个随机数生成器(或简称:PRNG)。 PRNG 将 return 一个数字序列, 看起来 随机,但实际上是一个确定性序列。 PRNG 生成的数字序列取决于其初始状态,即所谓的 种子值 。当您使用相同的种子初始化 PRNG 时,它将生成相同的序列。

这意味着当您希望游戏的每个 运行 都是独特的体验时,您需要为每个 运行 的 PRNG 使用不同的种子值。作为开发人员,您通常不关心该值从何而来,只关心它与您已经使用的不同。 Game Maker 的 randomize 函数的目的是用新种子重新为随机数生成器播种,该种子不太可能与上次游戏 运行 相同。我不知道那个函数到底做了什么 "under the hood" 来实现这一点,但它可能会计算来自各种熵源的种子值,比如当前时间、用户输入等。当你调用 randomize 多个次,那些熵源可能没有改变,所以你用相同的种子再次重新初始化它。这意味着 PRNG 将 return 相同的序列。

这意味着您通常应该恰好调用 randomize() 一次:游戏开始时。然后当你需要一个随机数时调用 irandom(n) 并且它应该每次 return 一个不同的随机数(或者相同的数字...... n 中有一个的机会)。所以你的游戏初始化函数应该是这样的:

randomize();
obj_r01.r01=irandom(9);
obj_r02.r02=irandom(9);
obj_r03.r03=irandom(9);

@Philipp 给出的答案 (https://gamedev.stackexchange.com/users/21890/philipp)


@DMGregory 评论的补充“(用户对 philipp 的回答发表评论)”是 randomize().

的真正用途

它应该设置种子,正如已经指出的那样,不需要多次设置,而且,如前所述 here

Please note, that when using the random number functions in GameMaker: Studio the initial seed is always the same, as this makes tracing errors and debugging far easier. Should you wish to test with true random, you should call this function at the start of your game.

因此,不调用将在 运行 期间产生相同的结果。最好的情况是只调用一次,在游戏开始时,不再调用它以使其 "truly" 随机。

@DH给出的答案。 (https://gamedev.stackexchange.com/users/51087/dh)