2011-04-01 9 views
10

Potrzebuję kilka linii kodu Java, które uruchamiają polecenie x procent czasu losowo.Java: zrób coś x procent czasu

psuedocode:

boolean x = true 10% of cases. 

if(x){ 
    System.out.println("you got lucky"); 
} 

Odpowiedz

16

Jeśli przez czas znaczy razy, że kod jest wykonywany tak, że chcesz coś, wewnątrz bloku kodu, który jest wykonywany 10% czasu cały blok jest wykonywany można po prostu zrobić coś takiego:

Random r = new Random(); 

... 
void yourFunction() 
{ 
    float chance = r.nextFloat(); 

    if (chance <= 0.10f) 
    doSomethingLucky(); 
} 

Oczywiście 0.10f oznacza 10%, ale możesz to zmienić. Jak każdy algorytm PRNG działa to w sposób przeciętny. Nie zbliżysz się do 10% chyba, że ​​yourFunction() zostanie nazwany rozsądną ilość razy.

+3

Ponieważ ' nextFloat() 'może spowodować zero, porównanie powinno być ściśle mniejsze niż. Innymi słowy, użyj '<' zamiast '<='. Oczywiście byłoby o wiele łatwiej uzasadnić kod, jeśli użyjesz 'nextInt (10)' zamiast 'float'. – erickson

+2

To jest nieprawidłowe. To po prostu błędne założenie, że zmienne nie są liczbami dokładnymi, więc użycie ścisłego porównania w tej sytuacji niczego nie zmieni, także dlatego, że losowa sekwencja jest generowana z wartości int. Rzucam Ci wyzwanie, by podać fragment, który pokazuje, że użycie tylko operatora daje bardziej poprawny (prawie 10%) wynik :) – Jack

+0

Wypróbuj sam: http://www.pastie.org/1744784 – Jack

26

Trzeba tylko coś takiego:

Random rand = new Random(); 

if (rand.nextInt(10) == 0) { 
    System.out.println("you got lucky"); 
} 

Oto pełna przykład, który mierzy go:

import java.util.Random; 

public class Rand10 { 
    public static void main(String[] args) { 
     Random rand = new Random(); 
     int lucky = 0; 
     for (int i = 0; i < 1000000; i++) { 
      if (rand.nextInt(10) == 0) { 
       lucky++; 
      } 
     } 
     System.out.println(lucky); // you'll get a number close to 100000 
    } 
} 

Jeśli chcesz coś jak 34% wy może użyć rand.nextInt(100) < 34.

0

Musisz określić „czas” po pierwsze, od 10% jest względną miarą ...

Np x jest prawdziwe co 5 sekund.

Można też użyć generatora liczb losowych, który pobiera próbki od 1 do 10 i zawsze robi coś, jeśli pobiera "1".

0

Zawsze możesz wygenerować losową liczbę (domyślnie jest to między 0 a 1 wierzę) i sprawdzić, czy jest < = 0,1, znowu nie jest równomiernie losowo ....

2

Można użyć Random. Możesz go zasiać, ale domyślnie często wystarcza.

Random random = new Random(); 
int nextInt = random.nextInt(10); 
if (nextInt == 0) { 
    // happens 10% of the time... 
} 
0
public static boolean getRandPercent(int percent) { 
    Random rand = new Random(); 
    return rand.nextInt(100) <= percent; 
} 
1

można spróbować to:


public class MakeItXPercentOfTimes{ 

    public boolean returnBoolean(int x){ 
     if((int)(Math.random()*101) <= x){ 
      return true; //Returns true x percent of times. 
     } 
    } 

    public static void main(String[]pps){ 
     boolean x = returnBoolean(10); //Ten percent of times returns true. 
     if(x){ 
      System.out.println("You got lucky"); 
     } 
    } 
} 
+0

Czy '≤' nawet działa ?! – michaelb958

+0

Nie, to był błąd. –

+0

To jest problematyczne, nigdy nie należy rzucać wyniku wywołania '.random()' na 'int', ponieważ wprowadzisz nielosowe błędy. Zamiast tego użyj odpowiednich metod 'Random', takich jak' .nextInt() ', które poprawnie obsługują te błędy. – dimo414

3

Aby wziąć swój kod jako bazę, można po prostu zrobić tak:

if(Math.random() < 0.1){ 
    System.out.println("you got lucky"); 
} 

FYI Math.random() wykorzystuje statyczną instancja: Random

Powiązane problemy