Số ngẫu nhiên trong phạm vi [tối thiểu - tối đa] sử dụng PHP


84

Có cách nào để tạo một số ngẫu nhiên dựa trên giá trị tối thiểu và tối đa không?

Ví dụ: nếu tối thiểu là 1 và tối đa 20, nó sẽ tạo ra bất kỳ số nào từ 1 đến 20, bao gồm cả 1 và 20?


1
Phiên bản php mới có trình tạo số ngẫu nhiên an toàn bằng mật mã .
Salvador Dali

1
Đối với PHP 7+ sử dụng random_int(), random_bytes()hoặc openssl_random_pseudo_bytes() . như @Salvador Dali đã nói rand()không tạo ra các kết quả an toàn bằng mật mã. Tài liệu Xem php.net/manual/en/function.rand.php
FrozenFire

Câu trả lời:


147
<?php
  $min=1;
  $max=20;
  echo rand($min,$max);
?>

tôi nghĩ rằng min và max cho rand là số chữ số để sử dụng thay vì số :) thnx
Val

Liên quan: nếu PHP_INT_MAX < ($max-$min), bạn cần thêm các khoảng với nhau, như được mô tả trong câu trả lời này .
Bishop

rand () trước PHP7.1 đơn giản là không tốt. Nó sử dụng thuật toán LCG cho kết quả với đầu ra có thể dự đoán được. Nó cũng chậm. Vì PHP7.1 rand () được tạo một bí danh của mt_rand () nên không còn tệ nữa. PHP7 cũng giới thiệu random_int mã hóa an toàn (), tuy nhiên nó nên tránh trừ khi cần thiết, vì nó chậm hơn nhiều so với mt_rand ()
xZero

34

Trong một PHP7 mới , cuối cùng cũng có một hỗ trợ cho các số nguyên giả ngẫu nhiên an toàn bằng mật mã.

int random_int ( int $min , int $max )

random_int - Tạo các số nguyên giả ngẫu nhiên an toàn bằng mật mã

về cơ bản khiến các câu trả lời trước đó trở nên lỗi thời.


2
Thật tuyệt! Nhưng cho đến khi máy chủ web hỗ trợ PHP7 trên toàn cầu, điều này không hữu ích cho bất kỳ ai đang xây dựng sản phẩm để phân phối. Vì vậy, các câu trả lời trước đó CŨNG làm việc trên PHP7 vẫn là phương pháp tốt nhất.
Matt Cromwell

1
@MattCromwell. Tôi không đồng ý với bạn. Cho đến khi các dịch vụ lưu trữ hỗ trợ PHP7, chúng ta nên sử dụng polyfill for random_intand random_bytesfunction - github.com/paragonie/random_compat .
Vladimir Posvistelik

Tôi tò mò, có bao giờ lý do KHÔNG sử dụng random_int không? Nếu nó cung cấp các số ngẫu nhiên "tốt hơn", tại sao không sử dụng nó vì những lý do không liên quan đến tiền điện tử?
Brian Leishman

1
@BrianLeishman Tôi muốn sử dụng nó cho mọi thứ. Nhược điểm duy nhất mà tôi có thể đoán được: nó có thể dựa vào nguồn ngẫu nhiên và có thể thất bại nếu bạn không ngẫu nhiên. Nó có thể là đắt hơn (cần phải kiểm tra) nhưng tôi nghi ngờ rằng một chức năng này làm cho một sự khác biệt lớn
Salvador Dali

Tôi biết rằng nó chậm hơn, nhưng nó không đáng kể để không quay lại và thay đổi các random_ints hiện có thành rands. Ngoài ra, trường hợp sử dụng của tôi là một thuật toán thử lại, và tôi chắc chắn không muốn nhiều chức năng thất bại kết tụ lại sau khi ngủ vì ints ngẫu nhiên có thể dự đoán
Brian Leishman

19

Một nhanh hơn phiên bản nhanh hơn sẽ sử dụng mt_rand:

$min=1;
$max=20;
echo mt_rand($min,$max);

Nguồn: http://www.php.net/manual/en/ Chức năng.mt-rand.php .

LƯU Ý: Máy chủ của bạn cần phải bật mô-đun Math PHP để điều này hoạt động. Nếu không, hãy thông báo lỗi cho máy chủ của bạn để kích hoạt nó hoặc bạn phải sử dụng rand () bình thường (và chậm hơn).


6
ý bạn là nhanh hơn phải không? sự khác biệt là (nhập == nhanh hơn so với nhanh hơn == hiệu suất khôn ngoan)
Val

english.stackexchange.com/questions/31732/… - thực sự có thể là cả hai
pe2pee


6

Tôi đã gói các câu trả lời ở đây và làm cho phiên bản độc lập;

function generateRandom($min = 1, $max = 20) {
    if (function_exists('random_int')):
        return random_int($min, $max); // more secure
    elseif (function_exists('mt_rand')):
        return mt_rand($min, $max); // faster
    endif;
    return rand($min, $max); // old
}


0

Hãy thử cái này. Nó sẽ tạo ra id theo ý muốn của bạn.

function id()
{
 // add limit
$id_length = 20;

// add any character / digit
$alfa = "abcdefghijklmnopqrstuvwxyz1234567890";
$token = "";
for($i = 1; $i < $id_length; $i ++) {

  // generate randomly within given character/digits
  @$token .= $alfa[rand(1, strlen($alfa))];

}    
return $token;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.