我有一个我正在为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?
答案 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);