Sử dụng hàm ngẫu nhiên PHP. Số ngẫu nhiên

Nhiệm vụ
Bạn cần tạo một số ngẫu nhiên trong phạm vi số.

Giải pháp
Hàm mt_Rand() được thiết kế cho việc này:

// số ngẫu nhiên giữa $upper và $bottom, bao gồm
$random_number = mt_rand($low, $upper);

Cuộc thảo luận
Việc tạo số ngẫu nhiên rất hữu ích khi bạn cần hiển thị một hình ảnh ngẫu nhiên trên màn hình, ngẫu nhiên chỉ định điểm bắt đầu trong trò chơi, chọn nhập ngẫu nhiên từ cơ sở dữ liệu hoặc tạo định danh duy nhất phiên. Để tạo một số ngẫu nhiên trong khoảng giữa hai điểm, bạn cần truyền hai đối số cho hàm mt_Rand():

$random_number = mt_rand(1, 100);

Việc gọi mt_rand() không có đối số sẽ trả về một số từ 0 đến số ngẫu nhiên tối đa được trả về bởi mt_getrandmax(). Rất khó để máy tính tạo ra một số thực sự ngẫu nhiên. Anh ấy giỏi hơn nhiều trong việc làm theo hướng dẫn một cách có phương pháp và không giỏi lắm nếu bị yêu cầu hành động một cách tự phát. Nếu bạn cần buộc máy tính tạo ra một số ngẫu nhiên thì bạn cần phải cho nó bộ cụ thể các lệnh lặp đi lặp lại, trong khi chính tính lặp lại làm cho việc đạt được tính ngẫu nhiên ít có khả năng xảy ra hơn.

PHP có hai trình tạo số ngẫu nhiên khác nhau: hàm cổ điển có tên là rand() và hàm nâng cao hơn là mt_rand().

MT (Mersenne Twister) là một trình tạo số giả ngẫu nhiên được đặt theo tên của nhà sư và nhà toán học người Pháp Marin Mersenne, người đã nghiên cứu các số nguyên tố. Trên những cái này số nguyên tố và thuật toán của trình tạo này dựa trên. Hàm mt_rand() nhanh hơn hàm rand() và tạo ra nhiều số ngẫu nhiên hơn, vì vậy chúng tôi thích hàm rand() hơn.

Nếu bạn có phiên bản PHP cũ hơn 4.2 thì trước khi gọi hàm mt_rand() (hoặc rand()) lần đầu tiên, bạn cần khởi tạo trình tạo với giá trị ban đầu bằng cách gọi mt_srand() (hoặc srand( )) chức năng. Giá trị ban đầu là số hàm ngẫu nhiên sử dụng nó làm cơ sở để tạo ra các số ngẫu nhiên mà nó trả về; nó đề cập đến một cách giải quyết vấn đề nan giải nêu trên – tính lặp lại và tính ngẫu nhiên.

Là giá trị ban đầu thay đổi rất nhanh và có xác suất lặp lại thấp (chính những đặc tính này sẽ đặc trưng cho sản phẩm tốt). giá trị ban đầu), bạn có thể lấy giá trị được trả về bởi hàm thời gian có độ chính xác cao microtime(). Chỉ cần khởi tạo máy phát điện một lần là đủ. PHP 4.2 trở lên phiên bản sau tự động xử lý việc khởi tạo, nhưng nếu giá trị ban đầu được đặt thủ công trước lệnh gọi đầu tiên tới mt_Rand(), PHP sẽ không thay thế nó bằng giá trị ban đầu của chính nó.

Nếu bạn cần chọn một bản ghi ngẫu nhiên từ cơ sở dữ liệu, cách dễ nhất trước tiên là xác định tổng số trường trong bảng, chọn một số ngẫu nhiên từ phạm vi đó, sau đó truy vấn hàng đó từ cơ sở dữ liệu:

$sth = $dbh->query("CHỌN ĐẾM(*) NHƯ đếm TỪ dấu ngoặc kép");
if ($row = $sth->fetchRow()) (
$count = $row;
) khác (
chết ($row->getMessage());
}
$random = mt_rand(0, $count - 1);
$sth = $dbh->query("CHỌN trích dẫn TỪ dấu ngoặc kép GIỚI HẠN $ngẫu nhiên,1");
while ($row = $sth->fetchRow()) (
in $row .

"\N";
}

Đoạn mã này xác định tổng số hàng trong bảng, tạo một số ngẫu nhiên từ phạm vi đó và sau đó sử dụng LIMIT $random,1 để CHỌN một hàng từ bảng bắt đầu từ vị trí $random. Trong MySQL phiên bản 3.23 trở lên, có thể có một tùy chọn thay thế:

$sth = $dbh->query("CHỌN trích dẫn TỪ dấu ngoặc kép ORDER BY RAND() LIMIT 1");
while ($row = $sth->fetchRow()) (
in $row . "\N";
}

Trong trường hợp này, đầu tiên MySQL chọn ngẫu nhiên các hàng và sau đó trả về hàng đầu tiên.

Để tạo một số ngẫu nhiên, bạn có thể sử dụng hàm PHP rand() hoặc mt_rand(). Yêu cầu sử dụng số ngẫu nhiên thường nảy sinh trong thực tế khi đặt tên biến, file, tạo thông tin key và đảm bảo tính bảo mật.

Tính ngẫu nhiên và duy nhất

Hàm ngẫu nhiên PHP có hai biến thể: rand() và mt_rand(). Người ta tin rằng thuật toán trong trường hợp đầu tiên đơn giản hơn và tạo ra các số giả ngẫu nhiên. Tùy chọn thứ hai có thuật toán nhanh hơn và các đặc tính toán học nổi tiếng. Trong hầu hết các trường hợp khi bạn cần lấy một số ngẫu nhiên, bạn có thể sử dụng một loạt lệnh gọi ngẫu nhiên PHP và nhận được một tổ hợp số duy nhất.

Nếu bạn lấy các số từ 1 đến 26 hoặc từ 1 đến 32 làm cơ sở và lấy ngẫu nhiên, bạn có thể hình thành Thông tin mấu chốt dưới dạng một chuỗi các chữ cái Latin hoặc Cyrillic. Trong trường hợp này, PHP ngẫu nhiên là một cách tạo ra một chuỗi thông tin theo thứ tự chữ cái, ví dụ như nhằm mục đích thử nghiệm các kênh truyền thông hoặc thuật toán.

Một số ngẫu nhiên hiếm khi là duy nhất vì nó có thể xuất hiện nhiều lần theo quy luật phân phối của một biến ngẫu nhiên. Nhưng nếu bạn kết hợp, đặc biệt, tĩnh Biến PHP&Toán.ngẫu nhiên Ngôn ngữ JavaScript, thì bạn có thể nhận được một số ngẫu nhiên thực sự duy nhất sẽ không lặp lại theo thời gian.

Sử dụng hàm thời gian

Hàm thời gian, cả PHP và JavaScript, cho phép bạn tạo các tổ hợp số duy nhất, hiếm khi có thể xảy ra đủ tại một thời điểm một số lượng lớn sự kiện và biến ngẫu nhiên sẽ lặp lại.

Bằng cách áp dụng ngẫu nhiên PHP trong phạm vi giây hoặc mili giây trên một phạm vi lớn các giá trị có thể, có thể thu được các kết hợp ngẫu nhiên duy nhất của các số hoặc chữ cái. Còn gì nữa?

Bằng cách kết hợp giá trị của hàm thời gian, số tăng tuần tự và PHP ngẫu nhiên hoặc bạn có thể đảm bảo tính bảo mật đáng tin cậy của các kênh liên lạc máy khách và máy chủ, tạo mã duy nhấtđối với các biến, tạo ra các sự kiện không thể đoán trước trong thuật toán.

Trình tạo số ngẫu nhiên PHP là giải pháp tuyệt vời cho hầu hết các tác vụ, đặc biệt khi bạn cần nhanh chóng nhận được kết quả chất lượng cao với chi phí tối thiểu. Việc sử dụng hàm rand() và mt_rand kết hợp với chuỗi số hoặc giá trị thời gian tăng dần theo tuần tự cho phép bạn thu được các số ngẫu nhiên, vừa lặp lại về giá trị vừa duy nhất.

Về mặt kỹ thuật, thuật ngữ "trình tạo số ngẫu nhiên" là vô nghĩa vì bản thân các số không phải là ngẫu nhiên. Ví dụ: 100 có phải là số ngẫu nhiên không? Còn 25 thì sao? Ý nghĩa thực sự của thuật ngữ này là nó tạo ra một dãy số xuất hiện ngẫu nhiên. Điều này đặt ra một câu hỏi khó hơn: dãy số ngẫu nhiên là gì? Câu trả lời đúng duy nhất: dãy số ngẫu nhiên là dãy trong đó tất cả các phần tử không liên quan với nhau. Định nghĩa này dẫn đến một nghịch lý là bất kỳ chuỗi nào cũng có thể là ngẫu nhiên hoặc không ngẫu nhiên, tùy thuộc vào cách thu được chuỗi đó. Ví dụ, hàng tiếp theo con số
1 2 3 4 5 6 7 8 9 0
đã được nhận bằng cách in dòng trên cùng bàn phím theo thứ tự, do đó trình tự không thể được coi là được tạo ngẫu nhiên. Nhưng điều gì sẽ xảy ra nếu bạn nhận được trình tự tương tự khi lấy những quả bóng tennis được đánh số ra khỏi thùng. TRONG trong trường hợp nàyđây đã là một chuỗi được tạo ngẫu nhiên. Ví dụ này cho thấy rằng tính ngẫu nhiên của một chuỗi phụ thuộc vào cách nó có được chứ không phụ thuộc vào chính chuỗi đó.

Hãy nhớ rằng dãy số do máy tính tạo ra có tính xác định: mỗi số ngoại trừ số đầu tiên đều phụ thuộc vào các số trước nó. Về mặt kỹ thuật, điều này có nghĩa là máy tính chỉ có thể tạo ra một chuỗi số gần như ngẫu nhiên, tức là. trên thực tế chúng không thực sự ngẫu nhiên. Tuy nhiên, điều này là đủ cho hầu hết các nhiệm vụ và để đơn giản, các chuỗi như vậy sẽ được gọi là ngẫu nhiên. Một phương pháp rất thú vị được phát triển bởi John von Neumann; nó thường được gọi là căn bậc hai. Trong phương pháp này, số ngẫu nhiên trước đó được bình phương và sau đó các chữ số ở giữa được trích xuất từ ​​kết quả. Ví dụ: nếu bạn đang tạo các số có ba chữ số và số trước đó là 121 thì bình phương nó sẽ cho kết quả 14641. Việc tách ba chữ số ở giữa sẽ cho số ngẫu nhiên tiếp theo là 464. Nhược điểm của phương pháp này là nó có rất khoảng thời gian lặp lại ngắn gọi là chu kỳ. Vì lý do này phương pháp này ngày nay không được sử dụng Phương pháp hiện đại Việc tạo số ngẫu nhiên khó khăn hơn nhiều.

Số ngẫu nhiên bằng PHP

PHP có hai nhóm hàm để làm việc với các số ngẫu nhiên. Hoàn toàn bên ngoài, chúng có thể được phân biệt bằng tiền tố mt_ cho tất cả các chức năng của một trong các nhóm.

Các tính năng không được dùng nữa
hàm rand Trả về một số nguyên từ 0 đến giá trị RAND_MAX (là 32767). Có thể có hai tham số nguyên tùy chọn - nếu chúng được chỉ định, một số ngẫu nhiên sẽ được tạo từ tham số đầu tiên đến tham số thứ hai.

Tiếng vang rand(); echo rand(1.100); // Đưa ra một số ngẫu nhiên từ 1 đến 100

Chức năng srand. Chỉ định chuỗi các số ngẫu nhiên được tạo bởi hàm rand. Có toàn bộ tham số - khi những nghĩa khác nhau Với tham số này, rand sẽ cho ra các dãy số khác nhau. Hàm srand chỉ cần được gọi một lần trước khi thực hiện tất cả các lệnh gọi tới hàm rand. Ví dụ sử dụng:

Srand(1288); // Khởi tạo trình tạo số ngẫu nhiên for($i=0; $i= 3.0.6, PHP 4, PHP 5)

Sự miêu tả:

Int mt_getrandmax (void)

Hiển thị giá trị tối đa có thể được trả về bởi mt_rand()

mt_Rand()

Tạo giá trị ngẫu nhiên tốt nhất (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Sự miêu tả:

int mt_Rand()

Nhiều phiên bản cũ hơn của trình tạo số ngẫu nhiên có những đặc điểm đáng nghi ngờ và hoạt động chậm. Theo mặc định, PHP sử dụng hàm rand() để tạo số ngẫu nhiên. Hàm mt_Rand() là một sự thay thế tốt. Cô ấy dùng máy phát điện ngẫu nhiên số, nhanh gấp 4 lần rand() và sử dụng Mersenne Twister.

Được gọi mà không có đối số tối thiểu và tối đa tùy chọn, mt_Rand() trả về giá trị giả ngẫu nhiên nằm trong khoảng từ 0 đến RAND_MAX. Ví dụ: nếu bạn cần lấy các giá trị ngẫu nhiên trong khoảng từ 5 đến 15, hãy tìm mt_Rand (5, 15).

Ví dụ sử dụng mt_rand()

Kết quả thực hiện ví dụ này sẽ có một cái gì đó như thế này:

1604716014
1478613278
6

Bình luận

Lưu ý: Trong các phiên bản trước 3.0.7, tham số thứ hai của hàm chỉ định phạm vi số. Ví dụ: để lấy số ngẫu nhiên từ 5 đến 15 trong các phiên bản này, bạn cần chỉ định hàm mt_Rand(5, 11).

mt_srand()

Đặt giá trị ban đầu máy phát điện tốt nhất số ngẫu nhiên (PHP 3 >= 3.0.6, PHP 4, PHP 5)

Sự miêu tả:

Vô hiệu mt_srand()

Đặt giá trị ban đầu của trình tạo số ngẫu nhiên bằng cách sử dụng hạt giống. Kể từ PHP 4.2.0, hạt giống là tùy chọn và cài đặt mặc định cho các giá trị ngẫu nhiên bị bỏ qua.

Ví dụ về sử dụng mt_srand()

Lưu ý: Kể từ PHP 4.2.0, không còn cần thiết phải khởi tạo trình tạo số ngẫu nhiên bằng srand() hoặc mt_srand() nữa vì việc này hiện được thực hiện tự động.