2011-04-01 34 views

Trả lời

16

Nếu bởi Hiện bạn có nghĩa là lần rằng mã đang được thực hiện, vì vậy mà bạn muốn một cái gì đó, bên trong một khối mã, đó là thực hiện 10% của thời đại toàn bộ khối được thực hiện bạn chỉ có thể làm điều gì đó như:

Random r = new Random(); 

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

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

Tất nhiên 0.10f là viết tắt của 10% nhưng bạn có thể điều chỉnh nó. Giống như mọi thuật toán PRNG, thuật toán này hoạt động theo mức sử dụng trung bình. Bạn sẽ không nhận được gần 10% trừ khi yourFunction() được gọi là số lần hợp lý.

+3

Bởi vì ' nextFloat() 'có thể dẫn đến không, so sánh phải được nghiêm ngặt ít hơn. Nói cách khác, sử dụng '<' thay cho '<='. Tất nhiên, nó sẽ dễ dàng hơn nhiều để lý luận chính xác về mã nếu bạn sử dụng 'nextInt (10)' thay vì 'float'. – erickson

+2

Không chính xác. Nó chỉ là một giả định sai, float không phải là con số chính xác vì vậy sử dụng một so sánh nghiêm ngặt trong tình huống này sẽ không thay đổi bất cứ điều gì, cũng bởi vì trình tự ngẫu nhiên được tạo ra từ các giá trị int. Tôi thách thức bạn cung cấp một đoạn trích cho thấy rằng chỉ sử dụng Jack

+0

Tự mình thử: http://www.pastie.org/1744784 – Jack

26

Bạn chỉ cần một cái gì đó như thế này:

Random rand = new Random(); 

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

Dưới đây là một ví dụ đầy đủ để đo lường nó:

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 
    } 
} 

Nếu bạn muốn một cái gì đó giống như 34% bạn có thể sử dụng rand.nextInt(100) < 34.

0

Bạn phải xác định "thời gian" trước tiên, vì 10% là thước đo tương đối ...

Ví dụ: x là đúng 5 giây một lần.

Hoặc bạn có thể sử dụng trình tạo số ngẫu nhiên để lấy mẫu thống nhất từ ​​1 đến 10 và luôn làm điều gì đó nếu anh ta lấy mẫu "1".

0

Bạn luôn có thể tạo ra một số ngẫu nhiên (theo mặc định nó nằm giữa 0 và 1 Tôi tin) và kiểm tra xem nó là < = 0,1, một lần nữa đây là không thống nhất ngẫu nhiên ....

2

Bạn có thể sử dụng Random. Bạn có thể muốn hạt giống nó, nhưng mặc định thường là đủ.

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

Bạn có thể thử này:


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

Liệu '≤' có hoạt động không ?! – michaelb958

+0

Không, đó là một sai lầm. –

+0

Đây là vấn đề, bạn không bao giờ nên bỏ kết quả của một cuộc gọi đến '.random()' đến một 'int', vì bạn sẽ giới thiệu các thành phần không ngẫu nhiên. Thay vào đó, hãy sử dụng các phương thức thích hợp của 'Random', chẳng hạn như' .nextInt() 'để xử lý những thành kiến ​​đó một cách chính xác. – dimo414

3

Chịu mã của bạn như một cơ sở, bạn chỉ có thể làm điều đó như thế:

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

FYI Math.random() sử dụng một tĩnh bản sao của Random

Các vấn đề liên quan