2012-06-27 34 views
6

Khi bạn có Math.floor(Math.random()*10)+1, nó phải chọn một số ngẫu nhiên từ 1-10 từ những gì tôi hiểu.Math.floor (Math.random()) +1 thực sự làm gì?

Tuy nhiên, khi tôi thay đổi +1 thành bất kỳ số nào cao hơn hoặc thấp hơn thì 1 Tôi nhận được kết quả tương tự. Tại sao điều này? +1 có nghĩa là gì?

+2

Nếu bạn thêm một cái gì đó nhiều hơn '+ 1' và bạn vẫn kết thúc với số từ 1-10 cái gì đó rất sai. –

+0

Chính xác bạn có ý nghĩa gì với "cùng một kết quả"? bạn có thể làm rõ hoặc đăng một số đầu ra? –

+0

(Để làm rõ - nếu bạn * luôn * và * chỉ * nhận số từ 1-10. Rõ ràng bất kỳ lần chạy nào chỉ có thể tạo ra 1-10, nhưng theo thời gian, điều này gần như chắc chắn * không * là trường hợp.) –

Trả lời

8

các trình tạo số ngẫu nhiên tạo ra một giá trị trong khoảng 0.0 < = n < 1.0. Nếu bạn muốn một số từ 1 đến thứ gì đó, bạn cần phải áp dụng khoản bù trừ +1.

Nói chung, bạn có thể sử dụng:

Math.floor(Math.random() * N) + M 

này sẽ tạo ra giá trị giữa M và M + N - 1.

demo Fiddle

+3

không hoàn toàn đúng: do 'Math.floor' của nó giữa M và M + N-1. Bạn cần 'Math.round' để có số giữa M và M + N. Tuy nhiên, trong trường hợp đó sự phân tán không bằng nhau, vì M và M + N chỉ có một nửa cơ hội để cuộn. – Christoph

+0

chỉ để cho vui: http://jsfiddle.net/poikl/x5gSz/ – Christoph

+0

Bạn chính xác. Bởi "giữa" tôi có nghĩa là "lên đến nhưng không bao gồm", đó là giá trị kỹ thuật trong phạm vi M <= n tadman

3

Math.random() tạo ra một số ngẫu nhiên giữa 0 và 1.

Do đó Math.random()*10 tạo ra một số ngẫu nhiên giữa 0 và 10, và (Math.random()*10)+1 một số từ 1 đến 11.

Math.floor() giảm phần thập phân của số này, và làm cho nó một số nguyên từ 0 đến 10

Bạn có thể thấy một sự tiến triển tuần tự của logic here

+4

'Math.random()' cũng có thể tạo '0,9999 ...'. Để chính xác, 'Math.random()' tạo một số giữa (bao gồm) 0 và (không bao gồm) 1. –

+0

Để xác minh, tôi chạy 'Math.random()' bốn lần. Nó không chỉ cho thấy rõ ràng rằng một phao trên '0.9' có thể thu được, mà còn là bạn có thể [không bao giờ chắc chắn về sự ngẫu nhiên] (http://dilbert.com/strips/comic/2001-10-25/): 0.9491507810734872/ 0.9815085749153463/ 0.7040373403047864/ 0.9940599762680827 –

+0

Điểm tốt - cập nhật câu trả lời tương ứng. Và có, nhưng là bất cứ điều gì bao giờ thực sự "ngẫu nhiên"! – jacktheripper

0

cơ bản:

(random() >= 0) luôn true

(random() < 1) luôn true

(Math.floor(random()) == 0) luôn true

tối đa:

(Math.floor(random() * 10) >= 0) luôn true

(Math.floor(random() * 10) < 10) luôn true

tối thiểu:

(Math.floor(random() * 10) + 1 >= 1) luôn true

(Math.floor(random() * 10) + 1 < 11) luôn true

Max Round:

(Math.round(random() * 10, 0) >= 0) luôn true

(Math.round(random() * 10, 0) <= 10) luôn true

2

Tổng số nằm giữa 1 và 10

  • Math.random() tạo số giữa 0 và 1 (với nhiều chữ số thập phân).

vv: math.random() [trở lại một cách ngẫu nhiên: ,19157057767733932]
(con số này sẽ vẫn có nhiều chữ số thập phân)

Để có được một số nguyên ngẫu nhiên, bạn cần phải nhân ngẫu nhiên số được tạo ra bởi 10

vv
math.random() * 10 = [trở lại một cách ngẫu nhiên: 2,9757621488533914]

  • Vì số vẫn sẽ có nhiều chữ số thập phân, hãy sử dụng phương thức tầng() để làm tròn số xuống/số nguyên gần nhất, giá trị ua từ 0 đến 9. Sau đó, bạn có thể thêm 1 để tạo số từ 1 đến 10.

vv:
Math.floor (0.6)   [return 0]
Math.floor (0.6) + 1   [trở lại 1]