[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"site-menu":3,"tag-xac-suat":14,"site-settings":56},{"items":4},[5,8,11],{"href":6,"label":7},"\u002F","Mới nhất",{"href":9,"label":10},"\u002Fcategory\u002Fdich-vu","Dịch vụ",{"href":12,"label":13},"\u002Fabout","Về tôi",{"items":15,"total":54,"page":54,"pageSize":55},[16],{"id":17,"wordpressId":18,"title":19,"slug":20,"excerpt":21,"contentHtml":22,"status":23,"authorName":24,"seoTitle":19,"seoDescription":21,"featuredMediaId":25,"featuredMedia":26,"categories":39,"tags":46,"publishedAt":52,"createdAt":52,"updatedAt":53},"93c528ab-2904-4a2f-83e6-ba71263d9b16",16348,"Laravel Lottery – Đem hên xui vào trong code","laravel-lottery-cong-cu-tao-xac-suat-ngau-nhien-trong-ung-dung","1. Mở đầu giang hồ? Laravel Lottery là một class nhỏ nhưng cực kỳ tiện lợi được thêm vào từ Laravel 10. Nó giúp bạn thực hiện các hành động theo xác suất, tức là cho phép một đoạn code chỉ chạy với tỉ lệ phần trăm nhất định — trước đây phải dùng mt_rand() […]","\n\u003Ch2 class=\"wp-block-heading\">1. Mở đầu giang hồ?\u003C\u002Fh2>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">\u003Cstrong>Laravel Lottery\u003C\u002Fstrong> là một class nhỏ nhưng cực kỳ tiện lợi được thêm vào từ \u003Cstrong>Laravel 10\u003C\u002Fstrong>. Nó giúp bạn thực hiện các hành động \u003Cem>theo xác suất\u003C\u002Fem>, tức là cho phép một đoạn code chỉ chạy \u003Cstrong>với tỉ lệ phần trăm nhất định\u003C\u002Fstrong> — trước đây phải dùng \u003Ccode>mt_rand()\u003C\u002Fcode> hay \u003Ccode>random_int()\u003C\u002Fcode> khá rườm rà, không có chút tuyệt kỹ nào.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ví dụ, các hạ có thể muốn:\u003C\u002Fp>\n\n\n\n\u003Cul class=\"wp-block-list\">\n\u003Cli>Thỉnh thoảng log thêm thông tin debug.\u003C\u002Fli>\n\n\n\n\u003Cli>Chỉ gửi email thông báo cho \u003Cstrong>5% người dùng may mắn\u003C\u002Fstrong>.\u003C\u002Fli>\n\n\n\n\u003Cli>Giảm tải một job tốn tài nguyên bằng cách chỉ chạy ngẫu nhiên.\u003C\u002Fli>\n\u003C\u002Ful>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Nếu tại hạ viết:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>if (rand(1, 100) &lt;= 5) {\n\u002F\u002F Do something 5% of the time\n}\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ờ thì cũng được, nhưng trông \u003Cstrong>thiếu đạo hạnh\u003C\u002Fstrong>, khó test, khó đọc, và không “Laravel” chút nào\u003C\u002Fp>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">2. \u003Cstrong>Bí kíp cơ bản\u003C\u002Fstrong>\u003C\u002Fh2>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Bộ pháp rất đơn giản:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>Lottery::odds($successes, $total)\n    -&gt;winner(function () {\n        \u002F\u002F Khi trúng \"xổ số\" 🎯\n    })\n    -&gt;loser(function () {\n        \u002F\u002F Khi trượt \"xổ số\" 😭\n    })\n    -&gt;choose();\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ví dụ:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>use Illuminate\\Support\\Lottery;\n\nLottery::odds(1, 10)\n    -&gt;winner(fn () =&gt; logger('Trúng 10% nè!'))\n    -&gt;loser(fn () =&gt; logger('Thua rồi...'))\n    -&gt;choose();\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Câu trên nghĩa là: \u003Cstrong>có 10% cơ hội thực thi callback “winner”\u003C\u002Fstrong>.\u003Cbr \u002F>Laravel sẽ tự sinh “số phận” cho mỗi lần chạy.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Nếu bạn muốn làm gì đó khi \u003Cem>không trúng\u003C\u002Fem>, có thể thêm \u003Ccode>loser()\u003C\u002Fcode>:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>Lottery::odds(1, 10)\n    -&gt;winner(fn () =&gt; info('🎉 Trúng rồi!'))\n    -&gt;loser(fn () =&gt; info('😅 Không trúng lần này.'));\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">3. \u003Cstrong>Vũ khí nâng cao\u003C\u002Fstrong>\u003C\u002Fh2>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">1. Sử dụng \u003Ccode>Lottery::odds()\u003C\u002Fcode> với cú pháp tinh gọn\u003C\u002Fh3>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Nếu chỉ cần biết có “trúng” hay không:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>\nif (Lottery::odds(1, 50)-&gt;choose()) {\n    \u002F\u002F 1\u002F50 cơ hội\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Rất hợp cho các tác vụ kiểu “thỉnh thoảng làm”:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>if (Lottery::odds(1, 100)-&gt;choose()) {\n    Cache::flush(); \u002F\u002F Lâu lâu dọn cache cho vui\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">2. Tùy chỉnh seed\u003C\u002Fh3>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Để đảm bảo kết quả “giống nhau” trong một phiên test, có thể thiết lập seed:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>Lottery::odds(1, 10)-&gt;seed('example')-&gt;choose();\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Cùng seed → cùng kết quả.\u003Cbr \u002F>Khác seed → vận mệnh đổi thay.\u003C\u002Fp>\n\n\n\n\u003Cblockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n\u003Cp class=\"wp-block-paragraph\">“Giang hồ có thể loạn, nhưng test phải ổn định.” 😆\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\n\n\n\u003Ch3 class=\"wp-block-heading\">3. Dùng trong ứng dụng thực chiến\u003C\u002Fh3>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Ví dụ trong \u003Cstrong>middleware\u003C\u002Fstrong>:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>public function handle($request, Closure $next)\n{\n   if (Lottery::odds(1, 1000)-&gt;choose()) {\n      logger('Sample request log');\n\n      return $next($request);\n   }\n}\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Hoặc trong \u003Cstrong>job queue\u003C\u002Fstrong>:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>if (Lottery::odds(1, 20)-&gt;choose()) {\n   $this-&gt;sendReport();\n}\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Hoặc \u003Cstrong>trong sự kiện marketing\u003C\u002Fstrong>:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>if (Lottery::odds(1, 100)-&gt;choose()) {\n        event(new LuckyUserRewarded($user));\n}\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">4. \u003Cstrong>Điểm mạnh và yếu của tuyệt học này\u003C\u002Fstrong>\u003C\u002Fh2>\n\n\n\n\u003Cfigure class=\"wp-block-table\">\u003Ctable class=\"has-fixed-layout\">\u003Cthead>\u003Ctr>\u003Cth>Thuộc tính\u003C\u002Fth>\u003Cth>Ưu điểm\u003C\u002Fth>\u003Cth>Nhược điểm\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\u003Ctr>\u003Ctd>\u003Cstrong>Cú pháp\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Dễ đọc, rõ nghĩa, “chuẩn Laravel”\u003C\u002Ftd>\u003Ctd>Hơi dư nếu chỉ cần random đơn giản\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Cstrong>Ứng dụng\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Tuyệt vời cho logging, sampling, thử nghiệm A\u002FB\u003C\u002Ftd>\u003Ctd>Không phù hợp cho game hoặc xác suất chính xác tuyệt đối\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Cstrong>Test &amp; debug\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Có thể seed để tái tạo kết quả\u003C\u002Ftd>\u003Ctd>Nếu quên seed, test có thể không ổn định\u003C\u002Ftd>\u003C\u002Ftr>\u003Ctr>\u003Ctd>\u003Cstrong>Tích hợp\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Dễ dùng trong middleware, jobs, events\u003C\u002Ftd>\u003Ctd>Không lưu trạng thái – hoàn toàn ngẫu nhiên mỗi lần gọi\u003C\u002Ftd>\u003C\u002Ftr>\u003C\u002Ftbody>\u003C\u002Ftable>\u003C\u002Ffigure>\n\n\n\n\u003Ch2 class=\"wp-block-heading\">\u003Cstrong>Tổng kết giang hồ\u003C\u002Fstrong>\u003C\u002Fh2>\n\n\n\n\u003Cblockquote class=\"wp-block-quote is-layout-flow wp-block-quote-is-layout-flow\">\n\u003Cp class=\"wp-block-paragraph\">“Code mà không có random thì như trà mà không có đá – nhạt lắm!”\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Laravel Lottery tuy nhỏ, nhưng cực kỳ hữu ích khi ta biết cách đặt nó đúng chỗ.\u003Cbr \u002F>Nó giúp code vừa tinh gọn, vừa dễ đọc, vừa có linh hồn “may rủi” rất tự nhiên.\u003C\u002Fp>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Còn nếu anh em đang viết hệ thống có tỷ lệ, sampling, logging —\u003Cbr \u002F>hãy thử vận nội công với câu thần chú:\u003C\u002Fp>\n\n\n\n\u003Cpre class=\"wp-block-code\">\u003Ccode>Lottery::alwaysWin();\nLottery::alwaysLose();\n\u003C\u002Fcode>\u003C\u002Fpre>\n\n\n\n\u003Cp class=\"wp-block-paragraph\">Điều này rất hữu ích trong unit test, giúp bạn kiểm soát logic mà không phải dựa vào may rủi.\u003C\u002Fp>\n","published","vdhoangson@gmail.com","c172673a-2be1-41d6-9d58-b5ed756676f0",{"id":25,"wordpressId":27,"filename":28,"storageKey":29,"sourceUrl":30,"mimeType":31,"altText":32,"caption":33,"width":34,"height":35,"createdAt":36,"updatedAt":37,"url":38},16349,"laravel-lottery.png","wordpress\u002F2025\u002F10\u002Flaravel-lottery.png","https:\u002F\u002Fvdhoangson.com\u002Fwp-content\u002Fuploads\u002F2025\u002F10\u002Flaravel-lottery.png","image\u002Fpng","",null,1050,700,"2025-10-23T08:35:18.000Z","2026-10-15T04:59:31.204Z","\u002Fuploads\u002Fwordpress\u002F2025\u002F10\u002Flaravel-lottery.png",[40],{"id":41,"wordpressId":42,"name":43,"slug":44,"parentId":45},"5f89b685-533f-4c09-85fa-d018f8fd71a4",3,"Laravel","laravel","f6aff5ed-b85e-45e6-bbdb-08788be09d67",[47],{"id":48,"wordpressId":49,"name":50,"slug":51},"3afa3d60-69b1-49fc-80ac-b59edb9ace73",314,"xác suất","xac-suat","2025-10-23T08:36:26.000Z","2025-11-09T12:59:12.000Z",1,12,{"siteName":57,"siteDescription":58,"contactEmail":59,"phone":60,"githubUrl":61,"facebookUrl":32},"vdhoangson.com","Ghi chép về lập trình, hệ thống và những điều học được trên đường làm sản phẩm.","contact@vdhoangson.com","+84 387 324 112","https:\u002F\u002Fgithub.com\u002Fvdhoangson"]