Baru -baru ini, mengirimkan amplop merah dan salam selama Tahun Baru Cina telah menjadi tren baru. Sebagai seorang programmer, ia jauh lebih penasaran tentang algoritma daripada tentang amplop merah. Di sini kami memperkenalkan strategi alokasi amplop merah acak yang dia pikirkan. Tolong beri saya beberapa nasihat.
Pendahuluan Algoritma
1. Batas jumlah amplop merah
Untuk amplop merah WeChat, kita tahu bahwa tidak ada satu amplop merah minimum acak adalah 1 poin dan jumlah maksimum adalah 200 yuan. Di sini kami juga mengatur jangkauan amplop merah. Kode berikut adalah unit uang.
// minimum kuota amplop merah private static final int minmoney = 1; // Kuota amplop merah maksimum private static final int maxmoney = 200 * 100;
2. Tentukan apakah jumlah amplop merah legal
Perhatikan bahwa langkah ini disertai oleh seluruh algoritma. Kita tidak hanya perlu menilai apakah jumlahnya legal sebelum mengalokasikan amplop merah, tetapi juga perlu menilai apakah jumlah yang tersisa legal setelah setiap orang secara tentatif menetapkan jumlah acak.
private boolean isright (int money, int count) {double avg = uang / count; if (rata -rata <minmoney) {return false; } if (rata -rata> maxmoney) {return false; } return true; } 3. Secara acak menghasilkan amplop merah
Di sini kami menggunakan metode acak untuk menghasilkan amplop merah antara Minmoney dan MaxMoney. Setelah menghasilkan amplop merah, kita perlu menentukan apakah sisa uang adalah amplop merah hukum. Jika itu bukan amplop merah hukum, kami akan menghasilkan kembali rencana distribusi. Saat menghasilkan kembali rencana distribusi, kita perlu menentukan apakah amplop merah yang dihasilkan terlalu besar atau terlalu kecil. Jika amplop merah terlalu besar, lain kali kita akan secara acak mencapai nilai kecil ke amplop merah dari jumlah amplop merah ini. Jika jumlah amplop merah terlalu kecil, kami akan menghasilkan amplop merah dengan jumlah amplop merah ke nilai besar.
private int random (int int, int mins, int maxs, int count) {// Jumlah amplop merah adalah 1, dan jumlahnya dikembalikan secara langsung jika (count == 1) {return money; } // Jika jumlah maksimum dan jumlah minimumnya sama, jumlahnya dikembalikan secara langsung jika (mins == maks) {return mins; } int max = maxs> uang? Uang: Maxs; // acak menghasilkan amplop merah int satu = ((int) math.rint (math.random () * (maks - mins) + mins)) % max + 1; int money1 = uang - satu; // menilai apakah rencana alokasi ini benar jika (isRight (money1, count -1)) {return satu; } else {double avg = money1 / (count - 1); if (rata -rata <minmoney) {// panggilan rekursif, ubah jumlah maksimum pengembalian amplop merah acak (uang, menit, satu, hitung); } lain jika (rata -rata> maxmoney) {// hubungi secara rekursif, ubah jumlah minimum pengembalian amplop merah acak (uang, satu, maks, hitung); }} return satu; } 4. Sadarilah alokasi amplop merah
Di sini, untuk menghindari amplop merah tertentu yang menempati sejumlah besar dana, kita perlu mengatur jumlah maksimum amplop merah non-terakhir, dan kami mengaturnya ke n kali jumlah rata-rata amplop merah; Dengan metode satu, dua, dan tiga, kita dapat menyadari alokasi amplop merah.
// Jumlah maksimum setiap amplop merah adalah kelipatan dari rata -rata final ganda statis privat = 2.1; Daftar Publik <Integer> splitRedPackets (int uang, int count) {if (! isRight (money, count)) {return null; } Daftar <Integer> Daftar = ArrayList baru <Integer> (); // Jumlah maksimum amplop merah adalah kali kali jumlah rata -rata int max = (int) (uang * kali /jumlah); Max = Max> MaxMoney? Maxmoney: Max; untuk (int i = 0; i <count; i ++) {int satu = acak (uang, minmoney, max, count - i); list.add (satu); Uang -= satu; } daftar pengembalian; }Evaluasi Rencana Alokasi Amplop Merah
Di atas memperkenalkan algoritma dasar untuk amplop merah. Mari kita verifikasi algoritma sekaligus. Misalkan ada amplop merah 200 yuan dan 100 eksemplar. Mari kita lihat rencana alokasi akhir.
Kode lengkap
/ ** *@Deskripsi: */ paket com.lulei.weixin.util; impor java.util.arraylist; impor java.util.list; impor com.lulei.util.jsonutil; kelas publik redpacketutil {// minimum red amplope kuota private static final int minmoney = 1; // Kuota amplop merah maksimum private static final int maxmoney = 200 * 100; // Jumlah maksimum dari setiap amplop merah adalah kelipatan dari rata -rata final ganda statis privat = 2.1; / ** * @param uang * @param Count * @return * @Author: lulei * @description: split red amplop */ daftar publik <integer> splitedpackets (int money, int count) {if (! isRight (uang, hitung)) {return null; } Daftar <Integer> Daftar = ArrayList baru <Integer> (); // Jumlah maksimum amplop merah adalah kali kali jumlah rata -rata int max = (int) (uang * kali /jumlah); Max = Max> MaxMoney? Maxmoney: Max; untuk (int i = 0; i <count; i ++) {int satu = acak (uang, minmoney, max, count - i); list.add (satu); Uang -= satu; } daftar pengembalian; } /** * @param uang * @param min } // Jika jumlah maksimum dan jumlah minimumnya sama, jumlahnya akan dikembalikan secara langsung jika (mins == maks) {return mins; } int max = maxs> uang? Uang: Maxs; // acak menghasilkan amplop merah int satu = ((int) math.rint (math.random () * (maks - mins) + mins)) % max + 1; int money1 = uang - satu; // menilai apakah rencana alokasi ini benar jika (isRight (money1, count -1)) {return satu; } else {double avg = money1 / (count - 1); if (rata -rata <minmoney) {// panggilan rekursif, ubah jumlah maksimum pengembalian amplop merah acak (uang, menit, satu, hitung); } lain jika (rata -rata> maxmoney) {// panggilan rekursif, ubah jumlah minimum pengembalian amplop merah acak (uang, satu, maks, hitung); }} return satu; } / ** * @param Money * @param Count * @Return * @Author: lulei * @description: Apakah ini jenis amplop merah legal? * / boolean pribadi isright (int int, int count) {double rata -rata = uang / jumlah; if (rata -rata <minmoney) {return false; } if (rata -rata> maxmoney) {return false; } return true; } public static void main (string [] args) {// todo Metode yang dihasilkan otomatis Stub redpacketutil util = redpacketutil baru (); System.out.println (jsonutil.parsejson (util.splitredpackets (20000, 100))); }}Untuk konten yang lebih menarik, silakan klik "Ringkasan Tutorial Pengembangan Android WeChat" dan "Java WeChat Development Tutorial Ringkasan" Selamat datang semua orang untuk dipelajari dan dibaca.
Di atas adalah semua tentang artikel ini, saya harap akan sangat membantu bagi semua orang untuk belajar pemrograman Java.