ios - 种子随机数 Objective-C

标签 ios objective-c random

我正在使用 Xcode 6 开发一款游戏,每次 2 个特定对象相互接触时都需要生成一个新的随机数。我曾尝试在我的应用程序开始时使用 srand(),但似乎值保持不变,就好像它没有在每次对象碰撞时播种新值一样。

这是代码

if((CGRectIntersectsRect(Stickman.frame, Box1.frame))) {
    xRan = arc4random()%11;

  if(xRan<=3){
        Spike1 = true;
        [self SpikeCall];
    }

    //Gold
    if (xRan==10) {
            G1 = true;
    }

Box1.center = CGPointMake(0,278);
Box1SideMovement = 5;      
}

问题是,当 Stickman 击中 Box1 后,当它返回屏幕时,它在 xRan 中仍然保持相同的值,除了某些情况下它会在 1-3 之间,然后它使 Spike1 为真。我希望它是这样的,每次对象 Box1 与 Stickman 相交时,xRan 都会在 1-10 之间播种一个新数字,这样 G1 变为真的概率为十分之一,如果 xRan 为 1-3,它将使Spike1 是真的。

最佳答案

这与其说是答案,不如说是评论,但对于评论来说太长了。

您的方法存在一些问题。首先,srand 不会为 arc4random 函数提供种子。它为 rand 函数提供了种子,这是一个不同的伪随机数生成器,其属性比 arc4random 稍差。 arc4random 没有明确的播种函数。其次,如果您想要 1 到 10 之间的随机数,则不应使用 % 11 方法。这会给你一个 0 到 10 之间的随机数(我认为你不想要零),但它也可能不会给你一个均匀的分布。即使 arc4random 擅长在其整个范围内提供均匀分布,它也可能无法提供最低有效位的均匀分布。

我建议你使用类似的东西:

arc4random_uniform(10) + 1

arc4random_uniform(10) 将返回一个介于 0 和 9 之间的数字,并将很好地提供该范围内的均匀分布。 +1 只是改变你的间隔,所以你得到 1 到 10 之间的数字,而不是 0 到 9 之间的数字。

关于ios - 种子随机数 Objective-C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30765473/

相关文章:

ios - 如何使某些角变圆的文本字段?

ios - 从终端设置 iOS 模拟器自定义位置

iphone - CoreData UITableViewController managedObjectContext 错误

objective-c - cocoa /ObjC : Place a floating window above a modal window

C++随机引擎不是真正随机的

ios - UITableView -> 如何在向下滚动时加载额外的条目?

ios - 我如何才能知道用户是否拥有纵向模式的 iPhone?

iphone - 限制 NSTableView 列中单元格中的文本长度

python - 使用给定范围内的随机数初始化矩阵 - python

Python,如何将此公式应用于数据库中的每一行,以便每一行给出不同的值,而不是每年的相同值