2012-12-12 27 views
5

thể trùng lặp:
Random number generator only generating one random numberMã chỉ chạy đúng khi bước qua nó bằng trình gỡ lỗi?

tôi một chút bối rối với vài khoảnh khắc này đây. Tôi có đoạn mã sau:

public blockType generateRandomBlock() 
{ 
    Random random = new Random(); 
    int makeBlockOfType = random.Next(0, 100); 

    blockType t = blockType.normal; 
    if (makeBlockOfType <= 80 && makeBlockOfType >= 60) 
    { 
     t = blockType.blue; 
    } 
    else if (makeBlockOfType > 80 && makeBlockOfType <= 95) 
    { 
     t = blockType.orange; 
    } 
    else if (makeBlockOfType > 95 && makeBlockOfType <= 100) 
    { 
     t = blockType.green; 
    } 

    return t; 
} 

Khá đơn giản, nó trả về một giá trị enum dựa trên một số được tạo ngẫu nhiên (dựa trên thời gian hệ thống). Thật không may cho một số lý do lẻ, tôi có tất cả các khối hoặc một màu hoặc khác mặc dù điều này chạy cho mỗi khối duy nhất được đưa vào trò chơi. Tuy nhiên, khi tôi bước qua điều này với trình gỡ lỗi và sau đó xem kết quả sau khi chạy một số, tôi thấy rằng các khối bây giờ đa màu dựa trên cơ hội được cung cấp. Tôi hơi bối rối về lý do tại sao điều này xảy ra.

Đối với điều này tôi đang sử dụng MonoGame sử dụng trình biên dịch Mono thay vì trình biên dịch Microsoft. Đây có phải là vấn đề không? Tôi đã cố gắng để đặt mã này inline vào constructor từ nơi nó đang được gọi nhưng tôi nhận được kết quả tương tự (tôi đoán trình biên dịch inlines anyways mã).

Tôi đã cố gắng khởi động lại Visual Studio riêng biệt thay vì cho phép chạy thực hiện việc xây dựng; không thay đổi.

Bất kỳ đề xuất và trợ giúp nào được đánh giá cao!

+1

cố gắng để di chuyển tạo ra ngẫu nhiên ra khỏi phương pháp, mà nên giúp đỡ. –

+0

'hạt giống mới ngẫu nhiên()' sử dụng thời gian, không đổi trong vài mili giây. – CodesInChaos

+0

Lý do nó hoạt động trong gỡ lỗi là có thời gian giữa các cuộc gọi và ngẫu nhiên thực sự có hạt giống khác nhau. – Archy

Trả lời

3

Khi bạn tạo nhiều phiên bản Random liên tục trong một khoảng thời gian rất ngắn, chúng có khả năng sẽ được khởi tạo với cùng giá trị giống phụ thuộc vào thời gian.

Để làm việc xung quanh này, bạn nên khởi Random bạn như là một lĩnh vực ví dụ thay vì:

private readonly Random random = new Random(); 

public blockType generateRandomBlock() 
{ 
    int makeBlockOfType = random.Next(0, 100); 

    // ... 
} 
7

Bạn nên instanciate ngẫu nhiên chỉ một lần (thiết lập nó như là một lĩnh vực tư nhân và instanciate trong constructor), xem tương tự câu hỏi: Random.Next returns always the same values

Xem Random documentation:

các ngẫu nhiên hệ số bắt đầu từ một giá trị giống. Nếu hạt giống được sử dụng nhiều lần, cùng một loạt các con số được tạo ra

Trong trường hợp của bạn, bạn tạo một trường hợp ngẫu nhiên với các hạt giống (quá gần trong thời gian) và bạn lấy giá trị đầu tiên mà sẽ tương tự cho một hạt giống đã cho.

4

Bạn đang tái tạo số ngẫu nhiên của bạn mỗi khi bạn gọi phương thức của bạn:

public blockType generateRandomBlock() 
{ 
    Random random = new Random(); 

Như hạt giống của các bộ tạo số ngẫu nhiên dựa vào thời gian này sẽ trả về giá trị tương tự cho các cuộc gọi liên tiếp.

Di chuyển sáng tạo của bạn của máy phát điện bên ngoài thường xuyên:

Random random = new Random(); 
public blockType generateRandomBlock() 
{ 
Các vấn đề liên quan