2015-07-28 14 views
6

Tôi muốn đặt các điểm ngẫu nhiên lên hình ảnh (dấu sao trong không gian cho một số dự án nhỏ vui vẻ)Tại sao rand() không thực sự ngẫu nhiên?

Tôi có tập lệnh đơn giản này.

<?php 
$gd = imagecreatetruecolor(1000, 1000); 
$white = imagecolorallocate($gd, 255, 255, 255); 

for ($i = 0; $i < 100000; $i++) 
{ 
    $x = rand(1,1000); 
    $y = rand(1,1000); 

    imagesetpixel($gd, round($x),round($y), $white); 
} 

header('Content-Type: image/png'); 
imagepng($gd); 
?> 

Hãy nhớ đây chỉ là để thử nghiệm, đó là lý do tại sao tôi đặt vòng 100000 trong for để nó hiển thị mẫu mà tôi nhận thấy đang nổi lên. Chúng tôi có 1 triệu pixel để sử dụng, tuy nhiên, ngẫu nhiên X và Y tạo mẫu này thay thế: enter image description here

Vì vậy, điều này là ngẫu nhiên. Tôi biết rand không phải là ngẫu nhiên thực sự, đó là lý do tại sao nó không phải là tốt cho mật mã. Nhưng tôi không tìm thấy thông tin về cách nó hoạt động và tôi nên làm gì để tránh các mẫu như thế này.

Trả lời

8

Máy tạo số ngẫu nhiên tuyến tính đồng bộ (sử dụng PHP rand) sẽ luôn hiển thị các hiệu ứng tự tương quan trên ô x-y.

Bạn sẽ có kết quả tốt hơn với mt_rand. Đây là máy phát điện Mersenne Twister.

+1

Cảm ơn bạn đã nhập từ khóa mà tôi đang tìm kiếm. Thực sự hữu ích. Tôi biết rất nhiều về PHP và lập trình nói chung, nhưng tôi chủ yếu là tự giáo dục khó khăn, vì vậy tôi thiếu một số thuật ngữ kỹ thuật. Tôi sẽ chấp nhận ASAP này. –

+0

Và mt_rand thực sự thực hiện công việc. Nó có vẻ ngẫu nhiên và thay đổi mỗi khi tôi chạy nó. http://i.imgur.com/DoeNFB9.png Cảm ơn bạn một lần nữa. –

Các vấn đề liên quan