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

时间:2017-04-20 00:52:59

标签: random game-maker

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

obj_r01 => r01=0;

obj_r02 => r02=0;

obj_r03 => r03=0;

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

enter image description here

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

obj_control 包含两个事件:创建绘制

enter image description here

克里特事件(obj_control):



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




绘制事件(obj_control):

此事件包含三个操作,正好是三个"执行一段代码":

enter image description here

第一个

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

在房间内对象排列如下:

enter image description here

执行中会发生以下情况:

enter image description here

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

结果:

enter image description here

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

1 个答案:

答案 0 :(得分:0)

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

上同一问题中收到的答案

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

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

这意味着当您希望每次运行游戏都是独特的体验时,您需要为每次运行使用不同的PRNG种子值。作为开发人员,您通常不关心价值来自何处,只是它与您已经使用过的不同。 Game Maker的randomize函数的目的是使用新种子重新种子随机数生成器,该种子不太可能与上次游戏运行时相同。我不知道那个功能到底是什么"引擎盖下#34;实现这一点,但它可能会计算各种熵源的种子值,如当前时间,用户输入等。当您多次调用randomize时,这些熵源可能没有更改,因此您重新初始化再次使用相同的种子。这意味着PRNG将返回相同的序列。

这意味着你通常应该只调用randomize()一次:游戏开始时。然后只需要一个随机数就可以调用irandom(n),每次都应该返回一个不同的随机数(或者相同的数字...... 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评论的补充"(用户评论菲律宾答案)"是randomize()的实际用途。

它应该设置种子,并且没有必要像已经提到的那样多次这样做,而且,正如所说here

  

请注意,在GameMaker:Studio中使用随机数函数时,初始种子始终是相同的,因为这会使跟踪错误和调试变得更加容易。如果你想用真正的随机测试,你应该在游戏开始时调用这个函数。

因此,不会调用将在运行中运行相同的结果。最好的情况是在游戏开始时只调用一次,而不是再次调用它来实现它真正的"随机的。

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