2012-09-17 68 views
36

Đây là mã của tôi để tạo số ngẫu nhiên bằng cách sử dụng hạt giống làm đối số.Số ngẫu nhiên Java Sử dụng hạt giống

double randomGenerator(long seed) { 
    Random generator = new Random(seed); 
    double num = generator.nextDouble() * (0.5); 

    return num; 
} 

Mỗi lần tôi cung cấp hạt giống và cố tạo 100 số, tất cả đều giống nhau.
Vui lòng trợ giúp.

+3

Đó là những gì hạt giống phải làm. Bạn chỉ tạo một số cho một hạt giống. Bạn đang cố gắng đạt được điều gì? –

+0

có thể trùng lặp của [Java ngẫu nhiên luôn luôn trả về cùng một số khi tôi đặt hạt giống?] (Http://stackoverflow.com/questions/5533191/java-random-always-returns-the-same-number-when-i- set-the-seed) – finnw

+2

Bạn có thể sử dụng 'System.currentTimeMillis()' làm hạt giống để tạo ra các kết quả ngẫu nhiên. Không cho bất kỳ hạt giống nào cũng tạo ra kết quả ngẫu nhiên. Tôi không chắc liệu nó sẽ bắt đầu lặp lại tại một thời điểm nào đó nếu bạn không đưa ra bất kỳ hạt giống nào. – WVrock

Trả lời

60

Nếu bạn đang cho cùng một hạt giống, điều đó bình thường, đó là tính năng quan trọng cho phép kiểm tra.

Kiểm tra này để hiểu thế hệ giả ngẫu nhiên và hạt: http://en.wikipedia.org/wiki/Pseudorandom_number_generator

Một bộ tạo số giả ngẫu nhiên (PRNG), còn được gọi là xác định phát bit ngẫu nhiên DRBG, là một thuật toán để tạo ra một chuỗi số xấp xỉ các thuộc tính của các số ngẫu nhiên. Trình tự không thực sự ngẫu nhiên ở chỗ là được xác định hoàn toàn bởi một tập hợp tương đối nhỏ các giá trị ban đầu, được gọi là trạng thái PRNG, bao gồm một hạt giống ngẫu nhiên thực sự.

Nếu bạn muốn có trình tự khác nhau (trường hợp thông thường khi không điều chỉnh hoặc gỡ lỗi thuật toán), bạn nên gọi hàm zero arg sử dụng nanoTime để cố gắng lấy hạt giống khác mỗi lần. Trường hợp này Random tất nhiên nên được giữ bên ngoài phương pháp của bạn.

Bạn đang có lẽ nên được như thế này:

private Random generator = new Random(); 
double randomGenerator() { 
     return generator.nextDouble()*0.5; 
} 
+0

Mili giây là một thời gian rất dài, sẽ an toàn hơn nhiều khi sử dụng System.nanoTime() – kukis

+0

@kukis Nó không quan trọng. Nó chỉ là một con số không giống nhau ở mọi chương trình ** ** khởi chạy. Bởi vì chương trình của bạn chỉ đặt hạt giống một lần. –

+1

sử dụng "ngẫu nhiên mới()" là tương đương hoặc tốt hơn xem nguồn: public Random() { this (seedUniquifier()^System.nanoTime()); } – dermoritz

6

Đó là nguyên tắc của Pseudo -RNG. Các con số không thực sự ngẫu nhiên. Chúng được tạo ra bằng cách sử dụng một thuật toán xác định, nhưng tùy thuộc vào hạt giống, trình tự các số được tạo khác nhau. Vì bạn luôn sử dụng cùng một hạt giống, bạn luôn nhận được cùng một chuỗi.

2

Vấn đề là bạn gieo hạt phát ngẫu nhiên một lần nữa. Mỗi lần bạn gieo hạt, trạng thái ban đầu của trình tạo số ngẫu nhiên được đặt lại và số ngẫu nhiên đầu tiên bạn tạo sẽ là số ngẫu nhiên đầu tiên sau trạng thái ban đầu

6

Bạn không nên tạo ra một ngẫu nhiên mới trong phạm vi phương pháp. Đặt thành viên là thành viên lớp học:

public class Foo { 
    private Random random 

    public Foo() { 
     this(System.currentTimeMillis()); 
    } 

    public Foo(long seed) { 
     this.random = new Random(seed); 
    } 

    public synchronized double getNext() { 
     return generator.nextDouble(); 
    } 
} 

Đây chỉ là ví dụ. Tôi không nghĩ rằng gói Random theo cách này sẽ thêm bất kỳ giá trị nào. Đặt nó vào một lớp học của bạn đang sử dụng nó.

+0

Tôi đặt nó trong lớp học chính của tôi và gọi nó từ đó. – WVrock

+0

Câu trả lời này gần như hoàn toàn không liên quan đến câu hỏi. –

+3

Nó có vẻ không liên quan vì nó chỉ đơn thuần là một nhà tái cấu trúc, nhưng nó chắc chắn có liên quan. OP đã khởi tạo lại bộ tạo ngẫu nhiên mỗi khi phương thức được gọi, vì vậy 'nextDouble' sẽ luôn trả về _first_ double trong chuỗi ngẫu nhiên. Câu trả lời này chỉ khởi tạo bộ tạo ngẫu nhiên một lần, và mỗi lần 'getNext' được gọi là nó thực sự bước qua chuỗi ngẫu nhiên và trả về một số khác nhau mỗi lần. –

2

Nếu bạn muốn tạo ra nhiều số sử dụng một hạt giống bạn có thể làm một cái gì đó như thế này:

public double[] GenerateNumbers(long seed, int amount) { 
    double[] randomList = new double[amount]; 
    for (int i=0;i<amount;i++) { 
     Random generator = new Random(seed); 
     randomList[i] = Math.abs((double) (generator.nextLong() % 0.001) * 10000); 
     seed--; 
    } 
    return randomList; 
} 

Nó sẽ hiển thị danh sách tương tự nếu bạn sử dụng hạt giống.

14

Cách đơn giản là sử dụng:

Random rand = new Random(System.currentTimeMillis()); 

Đây là cách tốt nhất để tạo ra Random số.

0

Một số ví dụ ở đây tạo ra một phiên bản Random mới, nhưng điều này là không cần thiết.Cũng không có lý do gì để sử dụng synchronized như một giải pháp. Thay vào đó, hãy tận dụng các phương pháp trên lớp ThreadLocalRandom:

double randomGenerator() { 
    return ThreadLocalRandom.current().nextDouble(0.5); 
} 
Các vấn đề liên quan