2014-04-14 16 views
7

Tôi là loại mới trong việc đặt cược trước. Bất cứ ai có thể vui lòng giúp tôi với giải pháp. tôi đang gặp một vấn đề về tạo số nguyên ngẫu nhiên số trong khoảng [0,5] trong số ngẫu nhiên fortran sử dụng random_seed và randcách tạo số ngẫu nhiên nguyên trong fortran 90 trong phạm vi [0,5]?

+1

'rand' là phần mở rộng của GNU. Sự kết hợp Fortran 95 là 'random_seed' và' random_number'. –

+1

Kết quả của chính xác 5 có thể chấp nhận được đối với bạn không? Hay bạn muốn hỏi về phạm vi [0,5]? Các đề xuất bên dưới sẽ không cung cấp cho bạn chính xác giá trị điểm cuối (ngoại trừ có thể bằng cách làm tròn.) –

+1

@SteveLionel Tôi không chắc chắn ý bạn là gì ... Bạn có thể mở rộng trên đó không? –

Trả lời

3

gì về:

program rand_test 
    use,intrinsic :: ISO_Fortran_env 
    real(REAL32) :: r(5) 
    integer  :: i(5) 

    ! call init_random_seed() would go here 

    call random_number(r) 

    ! Uniform distribution requires floor: Thanks to @francescalus 
    i = floor(r*6._REAL32) 

    print *, i 
end program 
+2

Sử dụng 'real :: ...' và '6.' sau đó. Nhưng xin vui lòng, làm cho mình một ưu và chuyển sang định nghĩa rõ ràng! –

+0

'i = tầng (r * 3.) - 1' –

+0

là ok nhưng sẽ phân phối đồng đều .....? \ – user3531410

4

Để hỗ trợ các answer bởi Alexander Vogt , Tôi sẽ khái quát.

Các nội random_number(u) trả về một số thực u (hoặc một mảng như vậy) từ sự phân bố đồng đều trong khoảng [0,1). [Tức là, nó bao gồm 0 nhưng không phải 1.]

Để phân bố đồng đều riêng biệt trên các số nguyên {n, n + 1, ..., m-1, m} khắc phân phối liên tục thành m + 1-n khối có kích thước bằng nhau, ánh xạ từng đoạn vào một số nguyên. Một cách có thể là:

call random_number(u) 
j = n + FLOOR((m+1-n)*u) ! We want to choose one from m-n+1 integers 

Như bạn có thể thấy, cho câu hỏi ban đầu cho {0, 1, 2, 3, 4, 5} điều này làm giảm tới

call random_number(u) 
j = FLOOR(6*u)   ! n=0 and m=5 

và đối với trường hợp khác trong bình luận của bạn {-1, 0, 1}

call random_number(u) 
j = -1 + FLOOR(3*u)  ! n=-1 and m=1 

Tất nhiên, biến đổi khác sẽ được yêu cầu cho bộ số nguyên không tiếp giáp, và ta nên chú ý đến vấn đề số.

+0

để tránh skew do số lượng hạn chế của bit trong 'thực tế '(53 cho IEEE 754 đôi chính xác, 24 cho duy nhất -precision), bạn có thể cần phải gọi 'random_number' nhiều lần ví dụ, xem [cách' _randbelow (n) 'được thực hiện thông qua' random() 'trong Python] (https://github.com/python/cpython/blob) /1dae7450c68bad498e57800387b24cb103c461fa/Lib/random.py#L243-L248) – jfs

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