2013-04-05 46 views
6

我想隨機生成基於百分比的YES或NO如何獲得25%的機會獲得YES或NO?

所以我要「滾」,並有25%的命中率是,75%的命中率NO

當時希望有人能指出我在正確的方向上做到這一點,最好的方式,也許一些文章或東西?

回答

11

所有其他的答案似乎把重點放在YES爲25%,這是1/4的概率百分比。但是如果百分比是0到100之間的任意整數呢?

BOOL randomBoolWithYesPercentage(int percentage) { 
    return arc4random_uniform(100) < percentage; 
} 

用百分比來調用它,如randomBoolWithYesPercentage(25)

如果百分比可以是分數,比如37.6%呢?然後我們需要變得更加複雜。這應該就足夠了:

BOOL randomBoolWithYesPercentage(double percentage) { 
    double r = 100 * (double)arc4random()/((double)UINT32_MAX + 1); 
    return r < percentage; 
} 
+0

只是一個說明:百分比應該像「56.5」等,不在0.0和1.0之間。 – Jonny 2014-09-05 03:13:27

1

在僞代碼:

x = rand(1,4); 
if (rand == 1) { 
    'yes' // 25% of the time you get 1 
} else { 
    'no'; // the other 75%, when you get 2,3,4 
} 
1

對不起,也許應該是一個註釋。 我沒有太多的IOS經驗,但我相信這可以很容易地應用/轉移。

一個簡單的解決方案是定義某種具有四個值的數組。 然後在這個數組中隨機選擇一個值。 然後在if/else語句的幫助下,如果命中特定的單個值,輸出將爲'yes',如果命中其他任何一個,則輸出爲'no'。


編輯:
馬克乙說什麼。
您也可以使用數組,例如(1,0,0,0)(yes,no,no,no)

5

使用隨機函數具有平等的分配,使之可能象要等於一個可能值

BOOL RollWithDenominator(NSInteger denominator) 
{ 
    return 0 == arc4random_uniform(denominator); 
} 

對於1/4的機率召喚RollWithDenominator(4);

+3

+1使用'arc4random_uniform',它沒有偏差。 – 2013-04-05 21:46:34

-1

既然你是編程對於iOS,您可以直接使用以下代碼:

在您的應用程序開始時調用此函數,這將允許您每次啓動應用程序時都得到不同的結果:

在點
srand (time(NULL)); 

然後在你的代碼,你需要隨機的結果,你使用:

BOOL result = false; 
int randomValue = rand()%4; 
if(randomValue==0) 
{ 
    result = TRUE; 
} 

變量「結果」是25%,真實,有75%的假!

+0

Objective-C使用'YES/NO'來布爾值而不是'TRUE/false' – 2013-04-05 21:44:08

+0

千萬不要使用rand()和模數。這是有偏見的。 – alecail 2013-04-05 22:08:54

+0

其實客觀C理解兩者! YES/NO和TRUE/FALSE – 2013-04-06 21:13:44

0

這裏有一個簡單的方法:

BOOL b = arc4random_uniform(4) == 0; 
+1

[arc4random_uniform()被推薦用於像arc4random()%upper_bound''這樣的結構,因爲當上限不是二的冪時,它避免了「模偏置」。](http://developer.apple.com/library/mac /#documentation/Darwin/Reference/Manpages/man3/arc4random_uniform.3.html) – 2013-04-05 21:45:30

+0

@ Paul.s非常好的一點。然而,恰恰如此,4是2的冪。 – tybro0103 2013-04-05 21:47:51

+1

這是真的,但想到下一個人來複制你的答案,但不使用兩個冪。這是一個大問題嗎?在大多數情況下可能不會,但最好編寫可複製的示例代碼。 ;) – 2013-04-05 21:50:16