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");
}
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");
}
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.
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
.
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".
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 ....
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...
}
public static boolean getRandPercent(int percent) {
Random rand = new Random();
return rand.nextInt(100) <= percent;
}
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");
}
}
}
Czy '≤' nawet działa ?! – michaelb958
Nie, to był błąd. –
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
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
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
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
Wypróbuj sam: http://www.pastie.org/1744784 – Jack