Hỏi cách random số trong vòng for mà ko bị lặp

Em có đoạn code như này viết trong Controller:

for($i = 0; $i < 10; $i++) {
    $test = rand(0, 20-1);
}

Em muốn random trong vòng for mà ko bị lặp lại số đã xuất hiện rồi thì làm như nào ạ? Hiện tại code của em thỉnh thoảng vẫn bị lặp lại vài số vì sau mỗi lần chạy nó lại random lại từ 0-19

Bạn random ít thì thôi cứ tạo một cái list, hoặc hashmap gì đấy, rồi cứ một vòng lặp random thì kiểm tra xem $test đã xuất hiên trong list/hashmap chưa, nếu rồi thì random lại đến khi nào ra số mới thì mới sang vòng lặp tiếp theo. Random ít thì khả năng collision không cao lắm.
Còn nếu bạn random nhiều một tí thì có thể random trước một cái list, sau đó xáo trộn list đó một cách ngẫu nhiên, rồi hiển thị lần lượt.
Còn nếu bạn random hàng triệu con số thì… ầy, có thể làm môt cái hàm mã hóa ánh xạ tập hợp S => S" với S" có tất cả phần tử của S nhưng khác thứ tự, behavior của hàm mã hóa đó là 1 seed ngẫu nhiên, nhưng mà khó lắm.
Ở đây có người viết một cách khá hay mà không cần tạo array, nhưng vẫn phải tạo hashmap: https://dev.to/babak/an-algorithm-for-picking-random-numbers-in-a-range-without-repetition-4cp6

5 Likes

Có cách nào tạo array ko ạ? Em kiếm thấy có hàm array_splice() gì đó nó xóa đc phần tử mà chưa biết xử lý sao

Đây là cách 2 nhé bạn:

<?php
	$arr = array();
	for ($i = 0; $i < 10; $i++) {
		 $arr[$i] = $i;
    }
  	shuffle($arr); 
	for ($i = 0; $i < 10; $i++) {
      	echo $arr[$i] . ' ';
    }
?>
4 Likes

Random như này chắc chỉ cần array < 100 là ok rồi, muốn tăng tính ngẫu thì random nhiều lần như vietlott ấy thay vì tạo mảng từ 0 - 1 triệu.

4 Likes

em cảm ơn :smiley: :smiley:

Sinh ra 7 số ngẫu nhiên trong khoảng 0 đến 20

var array = [...Array(20).keys()].sort((a, b) => Math.random() - 0.5).slice(0, 7);
2 Likes

shuffle sao ko dùng bạn :smiley:

Dùng hàm sort off-label kiểu này sẽ bias nặng và khó đọc :smiley:

2 Likes

Hàm shuffle(array) không có sẵn, phải thêm thư viện ngoài.

Edit: Mình nhầm với JS ạ T_T
Ngáo

2 Likes

Hàm so sánh mà cho số loạn cả lên có khi hàm sort chạy tuốt ra ngoài không chừng :smiley: mà viết tay bo cũng chả sao.

1 Like

tạo array: range

bốc 7 số ngẫu nhiên từ 0 đến 19:

$array = array_rand(range(0, 19), 7);
1 Like

Cho những ai vào đây trong tương lai, nếu bạn muốn làm như thớt nhưng lại muốn độ phức tạp thời gian là hằng số thì đây là vài link hữu ích:



3 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?