Câu hỏi Tạo số ngẫu nhiên giữa hai số trong JavaScript


Có cách nào để tạo số ngẫu nhiên trong một phạm vi được chỉ định (ví dụ: từ 1 đến 6: 1, 2, 3, 4, 5 hoặc 6) trong JavaScript không?


1244
2018-02-10 16:41


gốc


Math.floor (Math.random () * 7) - Amjad Masad
Chắc chắn .. Math.floor (Math.random () * 6 + 1) - Amjad Masad
Nabil Kadimi viết một bài báo về cách tạo số ngẫu nhiên âm quá. - madc
đây là một ý chính hữu ích: gist.github.com/kerimdzhanov/7529623 - Dan K.K.
có thể trùng lặp Tạo số ngẫu nhiên trong Javascript trong một phạm vi cụ thể?


Các câu trả lời:


Nếu bạn muốn nhận được từ 1 đến 6, bạn sẽ tính toán:

Math.floor(Math.random() * 6) + 1  

Ở đâu:

  • 1 là số bắt đầu
  • 6 là số kết quả có thể (1 + bắt đầu (6) - kết thúc (1))

1544
2018-02-10 16:45



Trong khi điều này sẽ làm việc, @ Mike, nó sẽ là tốt nhất để chỉ ra các phiên bản chung chung hơn như Francisc có nó dưới đây :-). - Raymond Machira
-1. Sau khi Google tìm thấy câu hỏi này, tiêu đề là "" Tạo giá trị ngẫu nhiên giữa hai số trong Javascript "." Sẽ không hoạt động nếu giá trị nhỏ nhất là 0 - Ydhem
Không hoạt động nếu bạn muốn một số giữa hai số lớn hơn ví dụ. Math.floor (Math.random () * 900) + 700 - Rob
Điều đó chỉ hoạt động nếu tối thiểu là 1. Nếu min là 2 và chúng tôi vẫn sử dụng Math.floor(Math.random() * 6) + 2 có nghĩa là nếu Math.random() kết quả thành 0,99 giá trị ngẫu nhiên của chúng tôi sẽ là 7 - antitoxic
Mã này không tốt vì, không hoạt động với bất kỳ số nào. Mã @Francisc là chính xác. - Lion King


function randomIntFromInterval(min,max)
{
    return Math.floor(Math.random()*(max-min+1)+min);
}

Những gì nó "thêm" là nó cho phép khoảng thời gian ngẫu nhiên mà không bắt đầu với 1. Vì vậy, bạn có thể nhận được một số ngẫu nhiên từ 10 đến 15 ví dụ. Mềm dẻo.


1664
2017-08-29 09:25



điều này cũng tuyệt vời bởi vì nếu ai đó không bao gồm to arg, from arg tăng gấp đôi - Jason
Cảm ơn câu trả lời này. Mã làm cho logic dễ hiểu. - brack
Xin chào. Đây là từ MDN: Returns a floating-point, pseudo-random number in the range [0, 1) that is, from 0 (inclusive) up to but not including 1 (exclusive), which you can then scale to your desired range. (developer.mozilla.org/en-US/docs/JavaScript/Reference/…) - Francisc
Đọc nhận xét ở trên. Ngẫu nhiên nằm bên trong [0,1), không phải [0,1]. - Francisc
Lưu ý rằng giải pháp này chỉ đúng nếu min và max là số nguyên, nếu không bạn có thể nhận được kết quả trong khoảng [min, ceil (max)]. I E. bạn có thể nhận được kết quả nằm ngoài phạm vi vì cao hơn giá thầu CPC - collimarco


Math.random ()

Từ Mozilla Tài liệu mạng nhà phát triển:

// Returns a random integer between min (include) and max (include)

Math.floor(Math.random() * (max - min + 1)) + min;

Các ví dụ hữu ích:

// 0 -> 10
Math.floor(Math.random() * 11);

// 1 -> 10
Math.floor(Math.random() * 10) + 1;

// 5 -> 20
Math.floor(Math.random() * 16) + 5;

// -10 -> (-2)
Math.floor(Math.random() * 9) - 10;

189
2018-06-11 00:23



Một cái gì đó mà tôi nhầm lẫn ... Math.floor (..) đảm bảo rằng số là một số nguyên mà Math.round (..) sẽ cung cấp cho một phân phối không đồng đều. Tham khảo: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… - alikuli
Tôi tin tưởng câu trả lời này. Bất cứ ai có thể cung cấp cho một liên kết hoặc giải thích rõ ràng về lý do tại sao điều này hoạt động? Có lẽ một ví dụ về cách Math.round sẽ đưa ra một sự thiên vị, và tại sao điều đó có nghĩa là chúng ta phải sử dụng công thức dường như khá phức tạp này? - Robin
@alikuli Đối với một loạt các [1,2], có 25% cơ hội Math.random() sẽ cung cấp cho bạn một số từ một trong những [0,0.49], [0.5,0.99], [1,1.49], [1.5,1.99]. Làm tròn các khoảng thời gian đó sẽ dẫn đến 0, 1, 1, 2 mà không phải là phân phối đồng đều. Ván chúng kết quả bằng 0, 0, 1, 1. - destoryer
@shuji này Là, trong số những người khác, câu trả lời đúng. Tôi chỉ muốn làm rõ lý do tại sao sử dụng Math.round kết thúc Math.floor sẽ cho kết quả khác nhau. - destoryer


Các giải pháp khác:

  • (Math.random() * 6 | 0) + 1
  • ~~(Math.random() * 6) + 1

76
2017-11-09 10:08



bạn có thể giải thích (hoặc đưa ra tham chiếu đến) ~ ~ sintaxis? Tôi chưa từng thấy nó trước đây! Giải pháp thanh lịch nhưng khó hiểu. - DiegoDD
Double Tilde  ~~a và Bitwise HOẶC (a | 0) là cách nhanh hơn để viết Math.floor (a) - edi9999
a | 0 cũng là cách nhanh nhất và được tối ưu hóa nhất để chuyển đổi chuỗi thành số nguyên. Nó chỉ hoạt động với các chuỗi chứa số nguyên ("444" và "-444"), tức là không có phao / phân số. Nó mang lại 0 cho mọi thứ thất bại. Đây là một trong những tối ưu hóa chính đằng sau asm.js. - pilau
@ edi9999 nhanh hơn để viết, nhưng nhanh hơn để thực hiện là tốt? - csguimaraes
Lưu ý: nếu bạn đang làm việc với một số số thực sự lớn thì dấu ngã hai sẽ không hoạt động. Thử ~~(Math.random() * (50000000000000 - 0 + 1)) + 0 và Math.floor(Math.random() * (50000000000000 - 0 + 1)) + 0 - BrunoLM


Hàm Math.random () trả về một dấu phẩy động, giả ngẫu nhiên   số trong phạm vi [0, 1); có nghĩa là, từ 0 (bao gồm) đến nhưng không   bao gồm 1 (độc quyền)

Hãy add các min  randomly từ 0 đến max-min

Case 0

min + 0 * (max- -min) = phút

Trường hợp 1

min + 1 * (max- -min) = tối đa

Trường hợp ngẫu nhiên sử dụng Math.random 0 <= r <1

min + r * (max- -min) = X, Ở đâu X có phạm vi phút <= X < tối đa

Kết quả trên X là một số ngẫu nhiên. Tuy nhiên do Math.random () ràng buộc bên trái của chúng tôi là bao gồm, và ràng buộc phải là độc quyền. Để bao gồm giới hạn bên phải của chúng tôi, chúng tôi tăng giới hạn bên phải lên 1 và kết quả là sàn.

function generateRandomInteger(min, max) {
  return Math.floor(min + Math.random()*(max+1 - min))
}

Để có được số ngẫu nhiên

generateRandomInteger(-20, 20);


28
2018-04-03 11:45





var x = 6; // can be any number
var rand = Math.floor(Math.random()*x) + 1;

15
2018-02-10 16:46



Thật. Tôi quên rand là 0 bao gồm. Sửa lỗi. - ryebr3ad
Đó là một phần giả mã ... ai đó có thể nghĩ rằng nó là có thật và cố gắng sử dụng nó như thế. - gravityboy
@gravityboy Bạn đang nói về cái gì vậy? Nếu ai đó không thể thay thế một số cho [chọn một số ...], họ có thể không phù hợp với tư cách là một lập trình viên. - ryebr3ad
@ ryebr3ad -1! nó nói trong javascript không phải trong mã giả và cũng không phải tất cả độc giả là lập trình viên hoàn thành. Nhiều người mới bắt đầu! - Steve
@ ryebr3ad: Tôi đã có một đồng nghiệp đang dạy thực tập về một môi trường cơ sở dữ liệu mà họ cần hỗ trợ. Anh ta bảo họ chọn mọi thứ ra khỏi bàn và họ bắt đầu viết "chọn mọi thứ ra khỏi ..." ngay trong trình soạn thảo truy vấn SQL. Anh ta cũng có phản ứng tương tự như vậy. - Ellesedil


Hoặc, trong Dấu gạch dưới

_.random(min, max)

14
2017-10-03 01:52



Và lodash: lodash.com/docs#random - mg1075


jsfiddle: https://jsfiddle.net/cyGwf/477/

Số nguyên ngẫu nhiên: để có được một số nguyên ngẫu nhiên giữa min và max, sử dụng mã sau

function getRandomInteger(min, max) {
  min = Math.ceil(min);
  max = Math.floor(max);
  return Math.floor(Math.random() * (max - min)) + min;
}

Số điểm nổi ngẫu nhiên: để có được một số dấu chấm động ngẫu nhiên giữa min và max, sử dụng mã sau

function getRandomFloat(min, max) {
  return Math.random() * (max - min) + min;
}

Tài liệu tham khảo: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/random


14
2018-01-25 04:33





Toán học không phải là điểm mạnh của tôi, nhưng tôi đã làm việc trên một dự án mà tôi cần để tạo ra nhiều số ngẫu nhiên giữa cả tích cực và tiêu cực.

function randomBetween(min, max) {
    if (min < 0) {
        return min + Math.random() * (Math.abs(min)+max);
    }else {
        return min + Math.random() * max;
    }
}

Ví dụ

randomBetween(-10,15)//or..
randomBetween(10,20)//or...
randomBetween(-200,-100)

Tất nhiên, bạn cũng có thể thêm một số xác nhận để đảm bảo bạn không làm điều này với bất cứ điều gì khác hơn là số. Ngoài ra hãy chắc chắn rằng min luôn nhỏ hơn hoặc bằng max.


11
2018-03-20 21:23



Điều này đơn giản là sai. min + Math.random() * max sẽ cung cấp cho bạn số lượng giữa min và min + max, mà không phải là những gì bạn muốn. Nhánh đầu tiên của if là đúng, nhưng có thể được đơn giản hóa để nói return min + Math.random() * (max - min), đó là giải pháp đúng bất kể min là dương hay âm (xem các câu trả lời khác). Ngoài ra, hãy nhớ rằng bạn vẫn cần phải kết quả sàn nếu bạn không muốn phân số. - Avish
ông nói toán học không phải là điểm mạnh của mình! ;) - Enrico