2013-06-28 30 views
15

Tôi cần tạo một số boolean ngẫu nhiên. Tuy nhiên, tôi cần phải xác định khả năng trả lại true. Kết quả là:Boolean ngẫu nhiên với trọng số hoặc thiên vị

private Random random = new Random(); 
random.nextBoolean(); 

sẽ không hoạt động.

Một giải pháp khả thi sẽ là:

private Random random = new Random() 

public boolean getRandomBoolean(float p){ 
return random.nextFloat() < p; 
} 

Tôi đã tự hỏi nếu có một cách tốt hơn hoặc tự nhiên hơn để làm điều này.

EDIT: Tôi đoán tôi đang hỏi liệu có một lớp thư viện cung cấp phương thức nextBoolean (float xác thực) hay không.

+3

loại "tốt hơn" Bạn đang tìm kiếm gì? Điều đó có vẻ hợp lý với tôi ... –

+1

Đây là hai vấn đề riêng biệt (chủ yếu), vì vậy nên được yêu cầu trong hai bài viết riêng biệt ... –

+0

@ JonSkeet Tôi đoán tôi đã hy vọng cho một cái gì đó dọc theo dòng Random.nextBoolean (xác suất dài) – maxf130

Trả lời

9

Tôi đã tự hỏi liệu có cách nào tốt hơn hay tự nhiên hơn để thực hiện việc này.

Cách tiếp cận bạn đang sử dụng đã ổn. * AFAIK, không có phương pháp Java chuẩn nào sẽ làm cho mã này ngắn hơn.


* Vì mục đích không mã hóa.

+2

đây không phải là một bình luận ?? –

+0

@Baadshah: Hmm, vâng. Tôi đã viết lại ngay bây giờ! –

+0

Yeah..perfect !!!! +1. –

-1

cách của bạn có lẽ là tốt hơn, mã golf-khôn ngoan, nhưng một cách khác để làm điều đó là như thế này:

public boolean getRandomBoolean() { 
    Random random = new Random(); 
    //For 1 in 5 
    int chanceOfTrue = 5; 

    if (random.nextInt(chanceOfTrue) == 0) { 
     return true; 
    } else { 
     return false; 
    } 
} 

Hoặc cho 2 trong 5, hãy thử này:

public boolean getRandomBoolean() { 
    Random random = new Random(); 
    //For 2 in 5 
    int chanceOfTrue = 5; 
    int randInt = random.nextInt(chanceOfTrue); 

    if (randInt == 0 || randInt == 1) { 
     return true; 
    } else { 
     return false; 
    } 
} 
-1

Đối tượng ngẫu nhiên cần được intialized rồi.

public static boolean flipRandom(double probability) { 
    Validate.isBetween(probability, 0, 1, true); 
    if(probability == 0) 
     return false; 
    if(probability == 1) 
     return true; 
    if(probability == 0.5) 
     return random.nextBoolean(); 
    return random.nextDouble() < probability ? true : false; 
} 
+0

Xác thực hợp lý, phần còn lại làm cho mã không cần thiết ít có thể đọc được. Giữ nó đơn giản – Oneiros

0
public boolean getBiasedRandom(int bias) { 
     int c; 
     Random t = new Random(); 
    // random integers in [0, 100] 
     c=t.nextInt(100); 
     if (c>bias){return false; 
     } 
     else{return true;} 
     } 

một này được dựa trên tỷ lệ phần trăm ...

0

Đây là những gì tôi đang sử dụng. Rất giống với câu trả lời của FracturedRetina.

Random random = new Random(); 

// 20% chance 
boolean true20 = (random.nextInt(5) == 0) ? true : false; 

// 25% chance 
boolean true25 = (random.nextInt(4) == 0) ? true : false; 

// 40% chance 
boolean true40 = (random.nextInt(5) < 2) ? true : false; 
+1

Toán tử bậc ba là hoàn toàn dư thừa. Tại sao không chỉ 'boolean true20 = (random.nextInt (5) == 0)'? – Oneiros

+0

Bạn biết làm thế nào khi bạn học một điều mới, nó hữu ích trong mọi tình huống? Tôi hoàn toàn đồng ý rằng nó thừa. – bobanahalf

0

Mở rộng về câu trả lời user2495765 của, bạn có thể làm cho một chức năng mà phải mất một tỷ lệ đầu vào (như hai giá trị ngẫu nhiên: phạm vi xem mã)

public class MyRandomFuncs { 
    public Random rand = new Random(); 

    boolean getBooleanAsRatio(int chance, int range) { 
     int c = rand.nextInt(range + 1); 
     return c > chance; 
    } 

}

Tùy thuộc vào những gì bạn có ý định để làm, bạn có thể không muốn initalize Random từ bên trong phương thức của bạn mà là sử dụng như một biến class (như trong đoạn code ở trên) và gọi nextInt() từ bên trong hàm của bạn.

0

Thư viện MockNeat triển khai tính năng này.

Ví dụ để tạo ra một giá trị boolean có 99,99% số là đúng:

MockNeat m = MockNeat.threadLocal(); 
boolean almostAlwaysTrue = m.bools().probability(99.99).val(); 
Các vấn đề liên quan