|
20精币
假设要生成一个1-50区间的随机数,但每个数字的权重不一样,1可能只有千分之一的概率,而2可能有5%,权重是手动赋予的。
我刚开始的想法是每个概率×1万,然后给每个区间定义上1-50,然后抽取一个10000的随机数,如果随机数是1-10,那么返回1,如果随机数是11-510,那么返回2·······但最后一百万次返回结果表明结果不符合原先设定的权限。经过筛查发现,10000的随机数落到1-100的概率奇低。
后来我设计了一个10000长度的一维数组,数组数值是1-50随机分布且符合权重值。然后在取万级随机数,但一百万次测试返回的结果依然不符合权重分布规律。代码新人爱好者,不太懂太深奥的,求大神指导一下。
[url=]随机数.e[/url]
窗口程序集名 | 保 留 | 保 留 | 备 注 | 程序集1 | | | | 变量名 | 类 型 | 数组 | 备 注 | 初始权重 | 权重分布 | 65 | 数据库句柄 | 整数型 | | 记录集句柄 | 整数型 | | 随机种子b | 整数型 | | 随机种子a | 整数型 | |
变量名 | 类 型 | 静态 | 数组 | 备 注 | sql | 文本型 | | | 循环的次数 | 整数型 | | | 字段值 | 整数型 | | | 随机数 | 整数型 | | | 随机统计 | 整数型 | | 100 | 计次循环首 (65, 循环的次数 ) 初始权重 [循环的次数 ].权重 = 100 初始权重 [循环的次数 ].代表值 = 循环的次数 计次循环尾 ()置随机数种子 (取启动时间 ()) 随机种子a = 取随机数 (1, 10000 )计次循环首 (1000, )置随机数种子 (随机种子a )随机种子b = 取随机数 (1, 10000 )随机数 = 生成随机数 (初始权重 )随机统计 [随机数 ] = 随机统计 [随机数 ] + 1 计次循环尾 ()计次循环首 (65, 循环的次数 )标准输出 (, 到文本 (循环的次数 ) + “:” + 到文本 (随机统计 [循环的次数 ]) + “ ”)如果真 (循环的次数 (循环的次数 \ 10 ) × 10 = 0 )标准输出 (, #换行符 )计次循环尾 ()延迟 (10000 )返回 (0 ) 变量名 | 类 型 | 静态 | 数组 | 备 注 | 最大值 | 整数型 | | | 循环的次数 | 整数型 | | | 模拟次数 | 整数型 | | | 已完成权分布 | 整数型 | | | 权分布位置 | 整数型 | | | 权分布 | 整数型 | | 10000 | 数值 | 整数型 | | | 随机数位置 | 整数型 | | | 随机数 | 整数型 | | | 局部权值 | 权重分布 | | 100 | 总权 | 整数型 | | | 复制数组 (局部权值, 权值 )最大值 = 取数组成员数 (局部权值 )模拟次数 = 10000 计次循环首 (最大值, 循环的次数 )总权 = 总权 + 局部权值 [循环的次数 ].权重 计次循环尾 ()计次循环首 (最大值, 循环的次数 )局部权值 [循环的次数 ].权重 = 局部权值 [循环的次数 ].权重 ÷ 总权 × 10000 + 1 计次循环尾 ()已完成权分布 = 0 置随机数种子 (随机种子b ) 判断循环首 (已完成权分布 ≠ 模拟次数 )权分布位置 = 万级随机数 () 如果 (权分布 [权分布位置 ] > 0 ) 数值 = 取随机数 (1, 最大值 )权分布 [权分布位置 ] = 局部权值 [数值 ].代表值 如果 (局部权值 [数值 ].权重 = 1 ) 删除成员 (局部权值, 数值, )最大值 = 最大值 - 1 局部权值 [数值 ].权重 = 局部权值 [数值 ].权重 - 1 已完成权分布 = 已完成权分布 + 1 判断循环尾 ()随机数位置 = 万级随机数 () 随机种子a = 随机数位置 × 随机数位置 随机数 = 权分布 [随机数位置 ]返回 (随机数 )返回值 = 取随机数 (0, 9 ) + 取随机数 (0, 9 ) × 10 + 取随机数 (0, 9 ) × 100 + 取随机数 (0, 9 ) × 1000 + 1 返回 (返回值 )
补充内容 (2023-7-2 02:34):
补充说明:不是生成上万个数据,查看是否符合权重。而是65个样本每天抽10个.因此我的检验方法是:每生成10个数字,随机重置种子,模拟每天变化。 |
-
-
自定义数据类型
|