2013-04-05 12 views
6

Chciałbym losowo generować tak lub nie w oparciu o procentjak mogę "rzucić" o 25% szansy na TAK lub NIE?

Więc chcę „rolka” i mają 25% szans na trafienie TAK, 75% szans na trafienie NO

Czy mając nadzieję, że ktoś może wskazać mi właściwy kierunek, najlepiej jak to zrobić, może jakiś artykuł czy coś takiego?

Odpowiedz

11

Wszystkie inne odpowiedzi zdają się skupiać na procent TAK jest 25%, co jest prawdopodobieństwo 1/4. Ale co, jeśli procent jest dowolną liczbą całkowitą z zakresu od 0 do 100?

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

Zadzwoń pod numer, taki jak randomBoolWithYesPercentage(25).

A co, jeśli wartość procentowa może być ułamkowa, np. 37,6%? Następnie musimy stać się bardziej wyrafinowanym. To powinno wystarczyć:

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

Po prostu notatka: Procent powinien być jak "56,5" itp., A nie między 0,0 a 1,0. – Jonny

1

W pseudo-kod:

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

Niestety, prawdopodobnie powinien być komentarz. Nie mam zbyt wiele doświadczeń z IOS, ale jestem pewien, że można to łatwo zastosować/przenieść.

Łatwym rozwiązaniem jest zdefiniowanie jakiejś tablicy z czterema wartościami. Następnie losowo wybierz wartość w tej tablicy. Następnie za pomocą instrukcji if/else, jeśli trafi konkretną, pojedynczą wartość, wynik będzie "tak", jeśli trafi on którykolwiek z pozostałych trzech wyników, będzie "nie".


EDIT:
Dokładnie to, co mówi Marc B.
Można również użyć tablicy, takiej jak (1,0,0,0) lub (yes,no,no,no).

5

Użyj funkcję losową równą dystrybucję i zrobić to tak prawdopodobne jak chcesz równać jedną z możliwych wartości

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

przypadku połączenia 1/4 szansy RollWithDenominator(4);

+3

+1 za używanie "arc4random_uniform", który jest bezkontaktowy. –

-1

Ponieważ jesteś programowania W przypadku iOS jest to kod, którego można użyć bezpośrednio:

Zadzwoń do tego na początku swojej aplikacji, dzięki czemu będziesz mieć różne wyniki za każdym razem, gdy zaczniesz aplikować:

srand (time(NULL)); 

Następnie w punkcie w kodzie gdzie trzeba losowe wyniki użyć:

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

zmiennej „wynik” jest o 25% prawdziwe i fałszywe 75%!

+0

Objective-C używa "YES/NO" dla wartości logicznych, a nie "TRUE/false" –

+0

Nigdy nie używaj rand() z modulo. Jest stronniczy. – alecail

+0

Właściwie obiektywne C rozumie oba! TAK/NIE i PRAWDA/FAŁSZ –

0

Oto prosty sposób:

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

[arc4random_uniform() jest zalecany w stosunku do konstrukcji takich jak arc4random()% upper_bound '', ponieważ unika "stronniczości modulo", gdy górna granica nie jest potęgą dwóch.] (Http://developer.apple.com/library/mac /#documentation/Darwin/Reference/Manpages/man3/arc4random_uniform.3.html) –

+0

@ Paul.s bardzo dobry punkt. Jednak tak się składa, że ​​4 to potęga 2. – tybro0103

+1

To prawda, ale pomyśl o kolejnym facecie, który przychodzi i kopiuje twoją odpowiedź, ale nie używa mocy dwóch. Czy to ogromny problem? W większości przypadków prawdopodobnie nie, ale lepiej napisać przykładowy kod, który można zreplikować. ;) –

Powiązane problemy