大概介绍下思路,细节根据需求具体情况酌情修改。
需求,根据数据的权重值来随机读取数据,权重值越大,被读到的几率越大。
根据这个需求,基本思路就是将生成的随机数按照权重值得多少来划分数据范围,每个值所占全部数据范围的比重和权重值匹配。
例如,有5个权重值:1,2,3,4,5那么将整个数据范围分为5个区域,每个数据所占的范围分别是10%,20%,30%,40%和50%
简单的模型为:
case when @num between 0 and 9 then 1 --0
when @num between 10 and 29 then 2 --1
when @num between 30 and 59 then 3 --3
when @num between 60 and 99 then 4 --6
when @num between 100 and 149 then 5 --10
END
所设置的数据范围值为1+2+3+4...的级数求和,也就是n*(n-1)/2,反向计算所得数值对应的权重值,即使求解一元二次方程式:n(n-1)/2=a
n=(1+SQRT(1+8a))
测试:
SELECT sv.number,CONVERT(INT,(1+SQRT(1+8*sv.number))/2) AS weighting FROM MASTER..spt_values AS sv WHERE sv.type='p'
number weighting
0 1
1 2
2 2
3 3
4 3
5 3
6 4
7 4
8 4
9 4
10 5
11 5
12 5
13 5
14 5
15 6
16 6
17 6
18 6
19 6
20 6
21 7
22 7
23 7
24 7
25 7
26 7
27 7
28 8
29 8
30 8
31 8
32 8
33 8
34 8
35 8
36 9
37 9
38 9
39 9
40 9
41 9
42 9
43 9
44 9
45 10
46 10
47 10
48 10
49 10
50 10
51 10
52 10
53 10
54 10
55 11
56 11
57 11
58 11
59 11
60 11
61 11
62 11
63 11
64 11
65 11
66 12
67 12
68 12
69 12
70 12
71 12
72 12
73 12
74 12
75 12
76 12
77 12
78 13
79 13
80 13
81 13
82 13
83 13
84 13
85 13
86 13
87 13
88 13
89 13
90 13
91 14
92 14
93 14
94 14
95 14
96 14
97 14
98 14
99 14
100 14
101 14
102 14
103 14
104 14
105 15
106 15
107 15
108 15
109 15
110 15
111 15
112 15
113 15
114 15
115 15
116 15
117 15
118 15
119 15
120 16
121 16
122 16
123 16
124 16
125 16
126 16
127 16
128 16
129 16
130 16
131 16
132 16
133 16
134 16
135 16
136 17
137 17
138 17
139 17
140 17
141 17
142 17
143 17
144 17
145 17
146 17
147 17
148 17
149 17
150 17
151 17
152 17
153 18
154 18
155 18
156 18
157 18
158 18
159 18
160 18
161 18
162 18
163 18
164 18
165 18
166 18
167 18
168 18
169 18
170 18
171 19
172 19
173 19
174 19
175 19
176 19
177 19
178 19
179 19
180 19
181 19
182 19
183 19
184 19
185 19
186 19
187 19
188 19
189 19
190 20
191 20
192 20
193 20
194 20
195 20
196 20
197 20
198 20
199 20
200 20
201 20
202 20
203 20
204 20
205 20
206 20
207 20
208 20
209 20
可以看出weighting越大它多覆盖number值得范围就越大(number就是生成的随机数)