Ví dụ đơn giản về Random có trọng số với PHP
Bài đăng này đã không được cập nhật trong 9 năm
Random có trọng số
Random là một khái niệm hẳn đã rất quen thuộc đối với nhiều lập trình viên, và hẳn ai cũng đã ít nhiều phải sử dụng đến các hàm random trong các dịch vụ của mình.
Thế nhưng liệu bạn đã từng gặp những bài toán yêu cầu phải random những phần tử có xác suất xuất hiện là không giống nhau, hay gọi đơn giản là random có trọng số.
Ví dụ như bài toán đặt ra là ta có một danh sách các sản phẩm, và cần random ra 5 sản phẩm trong số đó để hiện thị ở ngoài trang chủ. Tuy nhiên ta lại không muốn tỉ lệ random ra các sản phẩm là như nhau, thay vào đó, một sản phẩm được 10 người mua sẽ có tỉ lệ random ra lớn hơn so với một sản phẩm chỉ có 7 người mua.
Và bài viết này sẽ giới thiệu đến bạn một package Composer để bạn có thể giải quyết vấn đề đó.
bias-random
bias-random là một package nhỏ gọn được tôi viết ra để giải quyết bài toán random có trọng số một cách đơn giản: Nếu có 2 phần tử A, với trọng số là a, và B, với trọng số là b, thì tỉ lệ random ra A sẽ là a/(a+b), tỉ lệ random ra B là b/(a+b)
Yêu cầu
- PHP >= 5.4
Cài đặt
Cài đặt thông qua Composer
composer require wataridori/bias-random
Hoặc bạn có thể add wataridori/bias-random
vào phần require trong file composer.json
rồi sau đó chạy lệnh composer update
Sử dụng
$biasRandom = new wataridori/BiasRandom/BiasRandom();
$data = [
'wataridori' => 10,
];
$biasRandom->setData($data);
$biasRandom->addElement('Tran', 20);
$biasRandom->addElement('Duc', 30);
$biasRandom->addElement('Thang', 40);
// Random ra 1 phần tử trong số 4 phần tử là 'wataridori', 'Tran', 'Duc', và 'Thang'
// Tỉ lệ ra 'wataridori' sẽ là 10%
// Tỉ lệ ra 'Tran' sẽ là 20%
// Tỉ lệ ra 'Duc' sẽ là 30%
// Tỉ lệ ra 'Thang' sẽ là 40%
$biasRandom->random();
// Random ra 2 phần tử
$biasRandom->random(2);
Unit Test
Bạn có thể chạy unit test thông qua lệnh phpunit
Contributing
Bạn có thể tham khảo source code và tham gia đóng góp cho package bằng cách gửi pull request về địa chỉ https://github.com/wataridori/bias-random
Các bước rất đơn giản:
- Fork
- Clone
- Viết code & test case
- phpunit
- Push code
- Tạo Pull Request
All rights reserved