Tạo random một khoảng (từ 1 -> 1000) không bị trùng lắp !

1,535 views
Skip to first unread message

Thanh Quang

unread,
Apr 22, 2009, 8:59:37 AM4/22/09
to phpvi...@googlegroups.com
Mình có viết 1 cái hàm tạo random như sau :

function randomInt($max = 1)
    {
        $m = 1000000;
        return ((mt_rand(1,$m * $max)-1)/$m);
    }
Kết quả trả về mình đem chứa vào 1 mãng A, sau đó mình viết một hàm truyền 2 tham số là mãng A, và 1 giá trị B, mình kiểm tra nếu B tồn tại trong mãng A rồi thì gọi hàm randomInt lại, nhưng nếu giới hạn random nhõ thì việc này làm được, nhưng nếu mình giới hạn lớn thì việc này lại vô cùng nặng nề. Các bác có ý kiến nào về việc tạo random một khoảng số mà không bị trùng lắp không? Cám ơn trước !
--
Blog: http://www.camauonline.net
YM!: camauonline

Son Dat Giang

unread,
Apr 22, 2009, 10:58:03 AM4/22/09
to phpvi...@googlegroups.com
việc này khó đấy bác, 

không gian lấy giá trị của bác là N (tức là rand(0,N))

số lượng giá trị ngẫu nhiên khác nhau cần lấy là M

thì xác xuất trùng lặp sẽ tăng dần đến M/N

thua thôi, chắc không có cách nào đâu bác :D

cách tốt nhất là bác hãy luôn chú ý giữa tỉ lệ M/N, sao cho càng thấp càng tốt
---------------------------------
Best regards !
Giang Son Dat
Mobile: +84 988114164
Email giang...@gmail.com, giang...@yahoo.com


2009/4/22 Thanh Quang <qua...@gmail.com>

btnguyen2k

unread,
Apr 22, 2009, 11:59:24 AM4/22/09
to PHPVietnam
Tạo 1 cái mảng từ 1...N rồi array_shuffle và lấy ra M phần tử của
nó ;-)

Son Dat Giang

unread,
Apr 22, 2009, 12:07:06 PM4/22/09
to phpvi...@googlegroups.com
ohyeah, arrray_shuffle hay đấy ^^

---------------------------------
Best regards !
Giang Son Dat
Mobile: +84 988114164
Email giang...@gmail.com, giang...@yahoo.com


2009/4/22 btnguyen2k <btngu...@gmail.com>

Khoa Nguyen

unread,
Apr 22, 2009, 9:48:07 PM4/22/09
to phpvi...@googlegroups.com
Cách khác hay hơn nè :-"
- Tạo 1 mảng A gồm N phần tử; B gồm M phần tử.
- T = 0, Lặp:
+ Random 1 số K trong khoảng [T -> N - 1], lấy ra số X = A[K] cất vào B[T].
+ Hoán vị A[K] và A[T].
+ T = T + 1.
+ Nhảy tới "Lặp" cho đến khi nào T = M

Cách này chắc chắn chạy nhanh hơn và đỡ tốn CPU hơn cái array_shuffle 1000000000 lần =))

2009/4/22 btnguyen2k <btngu...@gmail.com>

Cong Dang Chien

unread,
Apr 22, 2009, 10:17:16 PM4/22/09
to phpvi...@googlegroups.com
Nếu N lớn thì giăng một mảng 1..N là không khả thi. Nếu ai đó có yêu cầu đặc biệt với số ngẫu nhiên thì nên tìm hiểu xem các thuật toán sinh số ngẫu nhiên nó hoạt động thế nào. Thực chất là giả ngẫu nhiên chứ không phải là ngẫu nhiên thật!

2009/4/23 Khoa Nguyen <inst...@gmail.com>

nhakhtn

unread,
Apr 22, 2009, 11:29:55 PM4/22/09
to PHPVietnam
Bác ra bài nầy chắc đang luyện thi cao học bên Bưu Chính Viễn Thông
hihi.

On 23 Tháng Tư, 09:17, Cong Dang Chien <hatza...@gmail.com> wrote:
> Nếu N lớn thì giăng một mảng 1..N là không khả thi. Nếu ai đó có yêu cầu đặc
> biệt với số ngẫu nhiên thì nên tìm hiểu xem các thuật toán sinh số ngẫu
> nhiên nó hoạt động thế nào. Thực chất là giả ngẫu nhiên chứ không phải là
> ngẫu nhiên thật!
>

> 2009/4/23 Khoa Nguyen <instc...@gmail.com>


>
> > Cách khác hay hơn nè :-"
> > - Tạo 1 mảng A gồm N phần tử; B gồm M phần tử.
> > - T = 0, Lặp:
> > + Random 1 số K trong khoảng [T -> N - 1], lấy ra số X = A[K] cất vào B[T].
> > + Hoán vị A[K] và A[T].
> > + T = T + 1.
> > + Nhảy tới "Lặp" cho đến khi nào T = M
>
> > Cách này chắc chắn chạy nhanh hơn và đỡ tốn CPU hơn cái array_shuffle
> > 1000000000 lần =))
>

> > 2009/4/22 btnguyen2k <btnguye...@gmail.com>

Thanh Quang

unread,
Apr 22, 2009, 11:50:30 PM4/22/09
to phpvi...@googlegroups.com
Cám ơn anh Thành và các bác nhiều, vấn đề đã tạm ổn.

2009/4/23 nhakhtn <nha...@gmail.com>

btnguyen2k

unread,
Apr 23, 2009, 5:29:17 AM4/23/09
to PHPVietnam
Thảy benchmark lên thử phát đi :D

On 23 Tháng Tư, 08:48, Khoa Nguyen <instc...@gmail.com> wrote:
> Cách khác hay hơn nè :-"
> - Tạo 1 mảng A gồm N phần tử; B gồm M phần tử.
> - T = 0, Lặp:
> + Random 1 số K trong khoảng [T -> N - 1], lấy ra số X = A[K] cất vào B[T].
> + Hoán vị A[K] và A[T].
> + T = T + 1.
> + Nhảy tới "Lặp" cho đến khi nào T = M
>
> Cách này chắc chắn chạy nhanh hơn và đỡ tốn CPU hơn cái array_shuffle
> 1000000000 lần =))
>

> 2009/4/22 btnguyen2k <btnguye...@gmail.com>


>
>
>
> > Tạo 1 cái mảng từ 1...N rồi array_shuffle và lấy ra M phần tử của
> > nó ;-)
>
> > On Apr 22, 7:59 pm, Thanh Quang <quan...@gmail.com> wrote:
> > > Mình có viết 1 cái hàm tạo random như sau :
>
> > > function randomInt($max = 1)
> > >     {
> > >         $m = 1000000;
> > >         return ((mt_rand(1,$m * $max)-1)/$m);
> > >     }
> > > Kết quả trả về mình đem chứa vào 1 mãng A, sau đó mình viết một hàm
> > truyền 2
> > > tham số là mãng A, và 1 giá trị B, mình kiểm tra nếu B tồn tại trong mãng
> > A
> > > rồi thì gọi hàm randomInt lại, nhưng nếu giới hạn random nhõ thì việc này
> > > làm được, nhưng nếu mình giới hạn lớn thì việc này lại vô cùng nặng nề.
> > Các
> > > bác có ý kiến nào về việc tạo random một khoảng số mà không bị trùng lắp
> > > không? Cám ơn trước !
> > > --
> > > Blog:http://www.camauonline.net

> > > YM!: camauonline- Ẩn nội dung trích dẫn -
>
> - Hiển thị văn bản được để trong dấu trích dẫn -

Nguyễn Hồng Quân

unread,
Apr 25, 2009, 11:48:07 AM4/25/09
to phpvi...@googlegroups.com
Cái này đâu đến trình độ cao học? Em không chuyên về Tin (em học Cơ điện tử) nhưng đã được học qua điều này hồi năm 2

nhakhtn a écrit :
Bác ra bài nầy chắc đang luyện thi cao học bên Bưu Chính Viễn Thông
hihi.

On 23 Tháng Tư, 09:17, Cong Dang Chien <hatza...@gmail.com> wrote:
  
Nếu N lớn thì giăng một mảng 1..N là không khả thi. Nếu ai đó có yêu cầu đặc
biệt với số ngẫu nhiên thì nên tìm hiểu xem các thuật toán sinh số ngẫu
nhiên nó hoạt động thế nào. Thực chất là giả ngẫu nhiên chứ không phải là
ngẫu nhiên thật!


--
Nguyễn Hồng Quân               
      
Yahoo!ID: ng_hquan_vn          
Identi.ca: hongquan               
Reply all
Reply to author
Forward
0 new messages