ランダムな赤い封筒を生成するための PHP アルゴリズム
1. 背景の紹介
少し前、会社のビジネスでは、固定の赤い封筒とランダムな赤い封筒に分けられる赤い封筒を生成する必要がありました。最小値と最大値を指定する場合、少なくとも A 最大値である必要があります。最小値は存在できませんが、赤いエンベロープは最小値より小さくすることはできません。
これまでにこれを行ったことがなかったので、少し混乱したため、Baidu に行って調べてみました。見つけたすべての赤いエンベロープ アルゴリズムにはさまざまなバグがあることがわかりました。負の値が計算されたり、最大値を超えたりする可能性がありました。価値があるので、自分でセットすることにしました。
2. 基本的なアイデア
乱数生成に関しては、このブロガーの悲惨な叔父のアイデアを借用しました:
何が起こっているのかまだわかりませんか?関係ないので一緒にコーディングしましょう!原文: たとえば、 1 つの赤い封筒を N 人に渡すことは、実際には N パーセンテージのデータを取得することと同じです。条件は、これらの N パーセンテージの合計 = 100/100 です。これらの N パーセントの平均は 1/N です。 そして、これらの N パーセントのデータは正規分布に準拠します (ほとんどの値は平均値に近づきます)。
解釈: たとえば、1,000 元があり、50 枚の赤い封筒を送る場合、ランダムに 50 個の数字を選択し、$avg/(1/N) を使用してこれら 50 個の数字の平均 $avg を計算します。基本の $mixrand を取得し、ランダムに生成された 50 個の数値を $mixrand で割って、基本の $randVal に対する各数値の割合を取得し、$randVal に 1,000 元を乗じて、各赤い封筒の特定の金額を取得します。 。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
<?php
/*
* Author:xx_lufei
* Time:2016年9月14日09:55:36
* Note:红包生成随机算法
*/
class
Reward
{
public
$rewardMoney
; #红包金额、单位元
public
$rewardNum
; #红包数量
#执行红包生成算法
public
function
splitReward(
$rewardMoney
,
$rewardNum
,
$max
,
$min
)
{
#传入红包金额和数量,因为小数在计算过程中会出现很大误差,所以我们直接把金额放大100倍,后面的计算全部用整数进行
$min
=
$min
* 100;
$max
=
$max
* 100;
#预留出一部分钱作为误差补偿,保证每个红包至少有一个最小值
$this
->rewardMoney =
$rewardMoney
* 100 -
$rewardNum
*
$min
;
$this
->rewardNum =
$rewardNum
;
#计算出发出红包的平均概率值、精确到小数4位。
$avgRand
= 1 /
$this
->rewardNum;
$randArr
=
array
();
#定义生成的数据总合sum
$sum
= 0;
$t_count
= 0;
while
(
$t_count
<
$rewardNum
) {
#随机产出四个区间的额度
$c
= rand(1, 100);
if
(
$c
< 15) {
$t
=
round
(sqrt(mt_rand(1, 1500)));
}
else
if
(
$c
< 65) {
$t
=
round
(sqrt(mt_rand(1500, 6500)));
}
else
if
(
$c
< 95) {
$t
=
round
(sqrt(mt_rand(6500, 9500)));
}
else
{
$t
=
round
(sqrt(mt_rand(9500, 10000)));
}
++
$t_count
;
$sum
+=
$t
;
$randArr
[] =
$t
;
}
#计算当前生成的随机数的平均值,保留4位小数
$randAll
=
round
(
$sum
/
$rewardNum
, 4);
#为将生成的随机数的平均值变成我们要的1/N,计算一下每个随机数要除以的总基数mixrand。此处可以约等处理,产生的误差后边会找齐
#总基数 = 均值/平均概率
$mixrand
=
round
(
$randAll
/
$avgRand
, 4);
#对每一个随机数进行处理,并乘以总金额数来得出这个红包的金额。
$rewardArr
=
array
();
foreach
(
$randArr
as
$key
=>
$randVal
) {
#单个红包所占比例randVal
$randVal
=
round
(
$randVal
/
$mixrand
, 4);
#算出单个红包金额
$single
=
floor
(
$this
->rewardMoney *
$randVal
);
#小于最小值直接给最小值
if
(
$single
<
$min
) {
$single
+=
$min
;
}
#大于最大值直接给最大值
if
(
$single
>
$max
) {
$single
=
$max
;
}
#将红包放入结果数组
$rewardArr
[] =
$single
;
}
#对比红包总数的差异、将差值放在第一个红包上
$rewardAll
=
array_sum
(
$rewardArr
);
$rewardArr
[0] =
$rewardMoney
* 100 - (
$rewardAll
-
$rewardArr
[0]);#此处应使用真正的总金额rewardMoney,
$rewardArr
[0]可能小于0
#第一个红包小于0时,做修正
if
(
$rewardArr
[0] < 0) {
rsort(
$rewardArr
);
$this
->add(
$rewardArr
,
$min
);
}
rsort(
$rewardArr
);
#随机生成的最大值大于指定最大值
if
(
$rewardArr
[0] >
$max
) {
#差额
$diff
= 0;
foreach
(
$rewardArr
as
$k
=> &
$v
) {
if
(
$v
>
$max
) {
$diff
+=
$v
-
$max
;
$v
=
$max
;
}
else
{
break
;
}
}
$transfer
=
round
(
$diff
/ (
$this
->rewardNum -
$k
+ 1));
$this
->diff(
$diff
,
$rewardArr
,
$max
,
$min
,
$transfer
,
$k
);
}
return
$rewardArr
;
}
#处理所有超过最大值的红包
public
function
diff(
$diff
, &
$rewardArr
,
$max
,
$min
,
$transfer
,
$k
)
{
#将多余的钱均摊给小于最大值的红包
for
(
$i
=
$k
;
$i
<
$this
->rewardNum;
$i
++) {
#造随机值
if
(
$transfer
>
$min
* 20) {
$aa
= rand(
$min
,
$min
* 20);
if
(
$i
% 2) {
$transfer
+=
$aa
;
}
else
{
$transfer
-=
$aa
;
}
}
if
(
$rewardArr
[
$i
] +
$transfer
>
$max
)
continue
;
if
(
$diff
-
$transfer
< 0) {
$rewardArr
[
$i
] +=
$diff
;
$diff
= 0;
break
;
}
$rewardArr
[
$i
] +=
$transfer
;
$diff
-=
$transfer
;
}
if
(
$diff
> 0) {
$i
++;
$this
->diff(
$diff
,
$rewardArr
,
$max
,
$min
,
$transfer
,
$k
);
}
}
#第一个红包小于0,从大红包上往下减
public
function
add(&
$rewardArr
,
$min
)
{
foreach
(
$rewardArr
as
&
$re
) {
$dev
=
floor
(
$re
/
$min
);
if
(
$dev
> 2) {
$transfer
=
$min
*
floor
(
$dev
/ 2);
$re
-=
$transfer
;
$rewardArr
[
$this
->rewardNum - 1] +=
$transfer
;
}
elseif
(
$dev
== 2) {
$re
-=
$min
;
$rewardArr
[
$this
->rewardNum - 1] +=
$min
;
}
else
{
break
;
}
}
if
(
$rewardArr
[
$this
->rewardNum - 1] >
$min
||
$rewardArr
[
$this
->rewardNum - 1] ==
$min
) {
return
;
}
else
{
$this
->add(
$rewardArr
,
$min
);
}
}
}
ログイン後にコピー
考慮すべき詳細:によると、次のコードは特定のビジネスロジックを制御するために使用されます。赤い封筒の最大値と最小値などを固定したまま、特定の要件に準拠します。1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 |
|
コードで赤い封筒を生成するメソッドを呼び出すとき、splitReward($total, $num,$max - 0.01, $min); を渡しました。値は 0.01 減らされ、生成される赤いエンベロープの最大値が設定した最大値を超えないことが保証されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
1 2 3 4 5 6 7 8 9 10 11 12 |
|
データチェック: 負の値の有無、最大値の有無、最大値の個数、最大値の有無を検出最小値より小さい値
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
|
正規分布図: 絵を描くとき、あまりにも多くの赤い封筒を与えないでください。ページはレンダリングされず、クラッシュします
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
|
PS: 友人が、生成されたデータが数学的に以下に準拠しているかどうかを尋ねました。標準正規分布、私の数学は苦手なので、特に考えたこともありませんでした。ただ見た目が似ていたので、彼のものだと思いました。
この問題に遭遇したので、これを解決する必要があるので、PHPの組み込み関数
を使用して計算しました。データ量が少ない場合、計算結果はまだ比較的正規分布に近いですが、データ量が多くなると、データが増えてしまい、今は見ることができません。興味のある方は、その理由を調べてください。 PHPの4つの関数:stats_standard_deviation(標準偏差)、stats_variance(分散)、stats_kurtosis(尖度)、stats_skew(歪度) 上記の関数を使用するには、
インストール
stats拡張子@ダウンロードアドレス5が必要です。この時点で、赤い封筒を書き終えました。50元の昇給が得られるかどうかはわかりませんが、緊急のニーズは解決できるはずです。
そうそう、このコードパッケージのダウンロードも残しました
以上がランダムな赤い封筒を生成するための PHP アルゴリズムの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHPは主に手順プログラミングですが、オブジェクト指向プログラミング(OOP)もサポートしています。 Pythonは、OOP、機能、手続き上のプログラミングなど、さまざまなパラダイムをサポートしています。 PHPはWeb開発に適しており、Pythonはデータ分析や機械学習などのさまざまなアプリケーションに適しています。

PHPはMySQLIおよびPDO拡張機能を使用して、データベース操作とサーバー側のロジック処理で対話し、セッション管理などの関数を介してサーバー側のロジックを処理します。 1)MySQLIまたはPDOを使用してデータベースに接続し、SQLクエリを実行します。 2)セッション管理およびその他の機能を通じて、HTTPリクエストとユーザーステータスを処理します。 3)トランザクションを使用して、データベース操作の原子性を確保します。 4)SQLインジェクションを防ぎ、例外処理とデバッグの閉鎖接続を使用します。 5)インデックスとキャッシュを通じてパフォーマンスを最適化し、読みやすいコードを書き、エラー処理を実行します。

PHPは動的なWebサイトを構築するために使用され、そのコア関数には次のものが含まれます。1。データベースに接続することにより、動的コンテンツを生成し、リアルタイムでWebページを生成します。 2。ユーザーのインタラクションを処理し、提出をフォームし、入力を確認し、操作に応答します。 3.セッションとユーザー認証を管理して、パーソナライズされたエクスペリエンスを提供します。 4.パフォーマンスを最適化し、ベストプラクティスに従って、ウェブサイトの効率とセキュリティを改善します。

PHPはWeb開発と迅速なプロトタイピングに適しており、Pythonはデータサイエンスと機械学習に適しています。 1.PHPは、単純な構文と迅速な開発に適した動的なWeb開発に使用されます。 2。Pythonには簡潔な構文があり、複数のフィールドに適しており、強力なライブラリエコシステムがあります。

PHPは1994年に発信され、Rasmuslerdorfによって開発されました。もともとはウェブサイトの訪問者を追跡するために使用され、サーバー側のスクリプト言語に徐々に進化し、Web開発で広く使用されていました。 Pythonは、1980年代後半にGuidovan Rossumによって開発され、1991年に最初にリリースされました。コードの読みやすさとシンプルさを強調し、科学的コンピューティング、データ分析、その他の分野に適しています。

PHPの中心的な利点には、学習の容易さ、強力なWeb開発サポート、豊富なライブラリとフレームワーク、高性能とスケーラビリティ、クロスプラットフォームの互換性、費用対効果が含まれます。 1)初心者に適した学習と使用が簡単。 2)Webサーバーとの適切な統合および複数のデータベースをサポートします。 3)Laravelなどの強力なフレームワークを持っています。 4)最適化を通じて高性能を達成できます。 5)複数のオペレーティングシステムをサポートします。 6)開発コストを削減するためのオープンソース。

phphassiblasifly-impactedwebdevevermentandsbeyondit.1)itpowersmajorplatformslikewordpratsandexcelsindatabase interactions.2)php'sadaptableability allowsitale forlargeapplicationsusingframeworkslikelavel.3)

PHPはWeb開発およびコンテンツ管理システムに適しており、Pythonはデータサイエンス、機械学習、自動化スクリプトに適しています。 1.PHPは、高速でスケーラブルなWebサイトとアプリケーションの構築においてうまく機能し、WordPressなどのCMSで一般的に使用されます。 2。Pythonは、NumpyやTensorflowなどの豊富なライブラリを使用して、データサイエンスと機械学習の分野で驚くほどパフォーマンスを発揮しています。
