3

我有一个我正在为 iOS 和 Android 编写的应用程序。在启动时,我试图获得 1 到 6 之间的随机数。

iOS(目标-C):

int random = rand() % (6 - 1) + 1;

安卓(Java):

Random random = new Random();
int num = random.nextInt(6)+1;

在这两种情况下,它们每次都返回 3。

从我读过的其他问题来看,人们遇到了同样的问题,因为他们正在遍历随机数并不断重新实例化 Random 对象。但我只想要一个随机数,所以我只实例化一次。

那么,我怎样才能获得这些代码中的任何一个来获得数字 1-6 而不仅仅是 3?

4

5 回答 5

4

对于 Objective-C 部分,我可以告诉你,你必须随机播种,如下所示:

srand(time(0)); // seed it using the current time

对于 Java 部分,new Random()构造函数会自动将其植入桌面应用程序的默认 JVM 中,但不会在 Android 上播种。在 Android 上,它使用默认种子值。

Random rand = new Random(System.nanoTime());
于 2012-10-16T19:41:13.700 回答
3

在 Objective-C 中,您可以交替使用arc4random()不需要种子的推荐函数。你会像这样使用它:

int random = (arc4random() % 5) + 1;

这个函数的一个巨大好处rand()是它的范围是 的两倍rand(),因此允许“更随机”的数字。

于 2012-10-16T20:43:11.543 回答
3

最好的解决方案是尽可能使用arc4random_uniform,它在 iOS 4.3 及更高版本中可用。它消除了通常由 mod 运算符引入的偏差。

+ (u_int32_t)randomInRangeLo:(u_int32_t)loBound toHi:(u_int32_t)hiBound {
    int32_t   range = hiBound - loBound + 1;
    return loBound + arc4random_uniform(range);
}

请注意,不需要播种,它会产生加密质量的随机数。

于 2012-10-16T22:27:25.273 回答
2

不确定 Android 上的 Random,但在其他情况下,您可能希望为 Random 实例播种一些相当独特的东西,例如系统时间。

Random r = new Random(System.currentTimeMillis());

于 2012-10-16T19:40:32.303 回答
0

我尝试了 Java 部分,它对我来说工作正常,但您可以尝试使用时间作为种子来实例化 Random:

    java.util.Date d = new java.util.Date();
    Random random = new Random(d.getTime());
    int num = random.nextInt(6)+1;
    System.out.println(num);
于 2012-10-16T19:41:22.363 回答