2013-03-02 63 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