2010-06-24 79 views
1

我有一个非常基本的随机数函数,它可以从一个范围内生成一个随机数;目标C中模数的随机数

即:

// The random is seeded earlier on in the applicationDidFinishLaunching() function 
-(NSUInteger)makeRandomNumber:(NSUInteger)minNumber to:(NSUInteger)maxNumber 
{ 
//NSUInteger i = (NSUInteger)((random()/(double)RAND_MAX) * y); 

NSUInteger i = (arc4random() % (maxNumber - minNumber)) + minNumber; 
return i; 
} 

我想一个可选模运算添加到这个功能,让你只返回是某种模数。

我想要这样做为随机的人产生工资,我发现工资,5或0多得多可读性。

我不确定如何制作可选参数或强制随机化继续循环,直到找到可选的模数值。

另一个问题是,如果没有找到模量,有时循环可能会永远持续下去。

ie;

随机化

0和100,并返回一个值,该值是5。

EDIT模量之间:这应该与任何范围内工作,而不管什么MIN或MAX是。以上数字只是例子。

+0

使用模运算符计算随机数通常是不好的。你不能保证你的随机数发生器的低位比特是随机的。 – 2010-06-24 13:36:55

+0

注释掉的randomiser是一种更好的随机分配方法吗? – zardon 2010-06-25 10:44:10

+0

我发现通过一些测试,范围不会返回您的范围内的maxNumber。 (代码) NSUInteger i =(arc4random()%(maxNumber - minNumber))+ minNumber;例如,如果我在1到10之间的范围内做了一个rand,我不会得到10,也不会得到1.如果你想要一个范围包括1和10(最小值和最大值)该算法需要调整。 – zardon 2010-06-25 11:15:16

回答

3

ITYM 多的5为了您的例子中,你只会产生0和20之间的随机值,然后通过5

+2

同意。你比我快43秒。 – adib 2010-06-24 12:13:18

+0

-1。这并不等同于所有可能的输出。你将有0.5%的几率产生0,19%的机会产生数字1-19,0.5%的几率产生20.除非你提供一些代码来修改OP的随机数发生器。 – 2010-06-24 13:56:21

+0

@Stephen Furlani:我没有说OP应该使用他现有的RNG - 我只是说“生成0到20之间的随机值然后乘以5”。 – 2010-06-24 14:14:55

-1

乘这个我觉得一个循环将工作不够好:

NSUInteger i = 0; 
do { 
    NSUInteger i = (arc4random() % (maxNumber - minNumber)) + minNumber; 
} while(i % 5 != 0); 
+0

这是相当低效和不必要的复杂。另外我认为你的终止条件需要'while((i%5)!= 0)'? – 2010-06-24 12:13:37

+0

是的,当然,这是我的错。这是20%的机会,如果你不经常打电话,效率不会太大问题 – vodkhang 2010-06-24 12:16:30

+0

这个循环很好,但我注意到保罗R说效率不高。我很乐意使用更高效的分辨率。谢谢。 – zardon 2010-06-25 11:02:45

-1

整数除法将确保您的数字是roundNumber的整数倍,因为它会截断除法中的小数,然后恢复乘法中的原始舍入数。

// The random is seeded earlier on in the applicationDidFinishLaunching() function 
-(NSUInteger)makeRandomNumber:(NSUInteger)minNumber to:(NSUInteger)maxNumber round:(NSUInteger) roundNumber 
{ 
NSUInteger i = (arc4random() % (maxNumber - minNumber)) + minNumber; 
return (i/roundNumber) * roundNumber; 
} 
+0

这并不等同于所有可能的输出 - 例如对于上面的例子(0..100),100会比其他可能的值更少发生。 – 2010-06-24 13:44:39

+0

@保罗,好吧,是的。由于你四舍五入/截断值,他们甚至不能分配。例如,即使遵循了一个体面的舍入规则(.5),只有当值为0-> .499时才会调用0,而如果值为0.5-> 1.4999,则会调用1。我会指出,你的回答并没有解决这个同等概率的问题。 等概率也不是OP的要求。可读性和可选舍入参数。 – 2010-06-24 13:49:53