2013-03-02 106 views
-1

這是我的代碼:範圍是不正確的

secretPointX = (arc4random() % 600) + 400; 
secretPointY = (arc4random() % 350) + 250; 

我使用這些作爲座標,並將其用於使用勾股定理一個圓的半徑。我的問題是,它不會產生範圍400-600和250-350之間的隨機數。它會生成指定範圍之外的數字。哪裏不對?

+0

它工作正常。你正在使用它不正確的你想要的。 – 2013-03-02 18:27:37

+1

請勿使用如此令人生厭的誤導性標題。 'arc4random()'工作得很好。使用它的代碼不會。 – 2013-03-02 18:28:51

+1

抱歉,這就是我爲什麼問的原因。如果我知道這不是arc4random錯誤,我不會問。 – JimmyYXA 2013-03-02 18:44:31

回答

4

Modulo部門爲您提供操作的其餘部分。簡單地說,當你像這樣使用它時,它會給你一個從0到小於右手操作數的數字。你得到的數字高達599,然後將其添加到400

你應該這樣做:

u_int32_t max = 600; 
u_int32_t min = 400; 
u_int32_t result = (arc4random % (max - min) + 1) + min; 

,或者更好,

arc4random_uniform(max - min + 1) + min; 
+0

它只是給了我一個巨大的數字 – JimmyYXA 2013-03-02 18:40:47

+0

arc4random_uniform(600-400)+400;那是對的嗎? – JimmyYXA 2013-03-02 18:41:30

+0

由於'arc4random_uniform'返回範圍爲「0 ..(val - 1)」的值,因此您需要'arc4random_uniform(max - min + 1)+ min'。 – rmaddy 2013-03-02 18:41:41

3

您正在生成一個介於零(包含)和600(不包括)之間的隨機數,然後將400添加到它。這自然會導致一個數字,是400和999使用的東西之間的這樣的替代:

secretPointX = (arc4random() % 201) + 400; 

您還可以使用arc4random_uniform(201)獲得零和200之間的隨機數沒有做模運算。

+0

請注意,範圍是半開放的,所以1000將永遠不會生成。 – 2013-03-02 18:30:44

+0

好的,謝謝。 – omz 2013-03-02 18:31:54

+0

它只是給我18734688 – JimmyYXA 2013-03-02 18:51:45