2011-10-25 38 views
10

chỉ tự hỏi, nếu tôi có đoạn mã sau:số ngẫu nhiên từ -9 đến 9 trong C++

int randomNum = rand() % 18 + (-9); 

này sẽ tạo ra một số ngẫu nhiên từ -9 đến 9?

+0

Related: http://stackoverflow.com/questions/686353/c-random-float/686373#686373 –

Trả lời

25

Không, nó sẽ không. Bạn đang tìm kiếm:

int randomNum = rand() % 19 + (-9); 

Có 19 số nguyên riêng biệt giữa -9 và +9 (bao gồm cả hai), nhưng rand() % 18 chỉ cung cấp 18 khả năng. Đây là lý do tại sao bạn cần sử dụng rand() % 19.

+0

tại sao 19 nhưng không phải 18? : S bối rối lol – Danny

+0

@Danny: Xem câu trả lời mở rộng. Nó dựa trên giả định rằng bạn muốn cả hai -9 và +9 là một phần của phạm vi. Nếu không, vui lòng làm rõ các yêu cầu của bạn. – NPE

+0

@Danny: vì 'rand()% 19' luôn nhỏ hơn 19, giá trị tối đa có thể là 18 và 18 - 9 là 9. –

7

Mã trả về số của bạn trong khoảng từ (0-9 đến 17-9) = (-9 và 8).

Để biết thông tin của bạn

rand() % N; 

lợi nhuận số giữa 0 và N-1 :)

Mã đúng là

rand() % 19 + (-9); 
2

Bạn đang đúng ở chỗ có 18 số về số lượng giữa -9 và 9 (bao gồm).

Nhưng máy tính sử dụng các số nguyên (tập Z) bao gồm số không, làm cho số đó là 19.

Tỷ lệ tối thiểu bạn nhận được từ rand() trên RAND_MAX bằng 0, vì vậy bạn cần trừ 9 để đến -9.

Ngoài ra, manpage for the rand function dấu ngoặc kép:

"Nếu bạn muốn tạo ra một số nguyên ngẫu nhiên từ 1 đến 10, bạn luôn nên làm điều đó bằng cách sử dụng bit bậc cao, như trong

j = 1 + (int) (10.0 * (rand()/(RAND_MAX + 1.0))); 

và không bao giờ bởi bất cứ điều gì giống như

j = 1 + (rand() % 10); 

(sử dụng bit đặt hàng thấp hơn). "

Vì vậy, trong trường hợp của bạn này sẽ là:

int n= -9+ int((2* 9+ 1)* 1.* rand()/ (RAND_MAX+ 1.)); 
+0

Thú vị về tạo số ngẫu nhiên với 'rand()' – Shahbaz

+0

Trên thực tế, [một số nguồn khác] (http://linux.die.net/man/3/rand) báo rằng vấn đề này ít nhiều là lịch sử. Nhưng có những vấn đề khác với rand() func và các hoạt động toán học khác trên nó, chẳng hạn như 13 chữ số sẽ có cơ hội cao hơn một chút của ocurring rằng 6 số khác. Nếu có thể, hãy sử dụng các chức năng tạo ngẫu nhiên mới từ C++ 11 (hoặc các phương án tăng cường) – KillianDS

+0

Đáng chú ý cho đến khi bị xóa khỏi manpages. – nurettin

5

Đừng quên mới C++11 pseudo-random functionality, có thể là một lựa chọn nếu trình biên dịch của bạn đã hỗ trợ nó.

Pseudo-code:

std::mt19937 gen(someSeed); 
std::uniform_int_distribution<int> dis(-9, 9); 
int myNumber = dis(gen) 
0

Bất cứ lúc nào bạn có nghi ngờ, bạn có thể chạy một vòng lặp mà được 100 triệu số ngẫu nhiên với thuật toán ban đầu của bạn, có giá trị thấp nhất và cao nhất và xem những gì sẽ xảy ra.

+0

Việc gỡ lỗi này rất hạn chế. Điều gì nếu mã của ông bằng cách nào đó sẽ tạo ra các bước 2, tối đa và min có thể là chính xác, nhưng sự phân phối sẽ không .... Trên thực tế, điều này chỉ có ý nghĩa nếu bạn vẽ một số loại biểu đồ – KillianDS

+0

Bạn đang nói về cái gì? mã của anh ta là 'rand()% 18 + (-9)' làm thế nào nó sẽ tạo ra các bước của 2? và anh ta không chắc chắn về ranh giới, không phải là phân phối. – Petruza

+1

Tôi đang nói về việc sử dụng bài kiểm tra của bạn, đó là khoảng 0. Câu hỏi không phải về ranh giới, đó là về "số ngẫu nhiên giữa -9 và 9" vì vậy tôi đoán anh ấy sẽ không hài lòng với việc thiếu 0 ví dụ. – KillianDS