2010-02-26 42 views
0

你怎么能不允许使用arc4random函数选择一些nubers?arc4random除了一些数字

当前代码:

int random = (arc4random() % 92);

(数字从0到92)

我希望它也禁止下列号码:31, 70, 91, 92

回答

9

首先,你需要改变

% 92 

% 93 

从0..92

得到的数字我会做这样的事情

int random; 

do { 
    random = arc4random() % 93; 
} 
while (random == 31 || random == 70 || random == 91 || random == 92); 
+0

啊,对不起,原来的代码指望一个数组,我知道数组有多少个对象了,所以我只是写了,而不是:) 帮我理解代码;基本上它是做一个随机数字,如果这个数字是其中的任何一个,那么得到一个新的?谢谢(: – Emil 2010-02-26 20:50:38

+1

@Emil - 正确。如果它是一个不允许的值,只需再次调用该方法。 – 2010-02-26 21:01:11

+0

太棒了!:)谢谢代码正在工作:) – Emil 2010-02-26 21:50:15

2

简单,继续要求数字:

get a new random number 
while the new number is one of the disallowed ones: 
    get a new random number 
return the random number 

伪代码,但你应该明白这个主意。

+0

是的,明白了。 :) – Emil 2010-02-26 20:51:09

4

如果你打算不允许数字91和92,为什么还要把它们包含在你的mod中呢?

扩大在以前的答案:

int random; 
do { 
    random = arc4random() % 91; 
} 
while (random == 31 || random == 70); 
+2

@harwig - 我也在想这个。但是,尽管从编码和执行的角度来看,它们的效率较低,但它们可以用来记录我们明确排除这些值的事实,以防有人决定在几年后改变模数。 – 2010-02-26 21:02:29

+0

@鲍勃考夫曼 - 非常好的一点,因为我相信这可能是未来令人头疼的一个潜在原因。 – harwig 2010-03-01 14:03:21

0

解决方案斯威夫特:

func randomValue(except: Int) -> Int { 
    var rand: Int = 0; 

    repeat { 
     rand = Int(arc4random_uniform(3) + 1) 
    } 
    while(rand == except) 

    return Int(rand) 
} 
+0

谢谢,这适用于一个例外,但不适用于例外列表! :) – Emil 2017-08-06 20:33:40