范围内的随机数

时间:2012-10-16 19:36:14

标签: java ios random

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

iOS(Objective-C):

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

Android(Java):

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

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

从我读过的其他问题来看,人们遇到了同样的问题,因为他们正在循环使用random并继续重新实现Random对象。但我只想要一个随机数,所以我只想实例化一次。

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

5 个答案:

答案 0 :(得分:4)

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

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

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

Random rand = new Random(System.nanoTime());

答案 1 :(得分:3)

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

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

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

答案 2 :(得分: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);
}

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

答案 3 :(得分:2)

不确定Android上的Random,但在其他情况下,您可能希望使用合理唯一的内容(例如系统时间)为Random实例播种。

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

答案 4 :(得分: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);