开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

用微信号发送消息登录论坛

新人指南 邀请好友注册 - 我关注人的新帖 教你赚取精币 - 每日签到


求职/招聘- 论坛接单- 开发者大厅

论坛版规 总版规 - 建议/投诉 - 应聘版主 - 精华帖总集 积分说明 - 禁言标准 - 有奖举报

查看: 885|回复: 13
收起左侧

[易语言] 求助:希望实现易语言按照设定权重生成随机数

[复制链接]
结帖率:0% (0/1)
发表于 2023-7-1 22:05:08 | 显示全部楼层 |阅读模式   上海市上海市
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
计次循环首 (最大值, 循环的次数)
总权 = 总权 + 局部权值 [循环的次数].权重  ' 所有权重不为1万,所以要将总权重达到一万
计次循环尾 ()
计次循环首 (最大值, 循环的次数)
局部权值 [循环的次数].权重 = 局部权值 [循环的次数].权重 ÷ 总权 × 10000 + 1  ' 重新赋予每个单位权重,保证总权重为1万,这里的+1是因为数值为整数,小数位会舍弃,导致不足1万。
计次循环尾 ()
已完成权分布 = 0
置随机数种子 (随机种子b)  ' 原来没有这个,用的计算机启动时间,但发现短时间每次运行结果一样。
判断循环首 (已完成权分布 ≠ 模拟次数)
权分布位置 = 万级随机数 ()  ' 设定一个一万长度的数组,每次从1万中取随机数,
如果 (权分布 [权分布位置] > 0)  ' 如果数组对应的随机数为0,那么再取(1~最大值)的随机数将其填充,
' 如果数组对应随机数不为0,那么证明之前取样过,则再次生成一万的随机数。


数值 = 取随机数 (1, 最大值)
权分布 [权分布位置] = 局部权值 [数值].代表值
如果 (局部权值 [数值].权重 = 1)  ' 当取出(1~最大值)的随机数并赋值后,需将其权重-1,权重为0时删除。以保证数组中的数值符合权重分布规律。
删除成员 (局部权值, 数值, )
最大值 = 最大值 - 1



局部权值 [数值].权重 = 局部权值 [数值].权重 - 1

已完成权分布 = 已完成权分布 + 1  ' 当分配10000次后,结束循环。计算过总循环次数,循环次数基本符合概率学规律。

判断循环尾 ()
随机数位置 = 万级随机数 ()  ' 再次取一个随机数,查找数组对应位置的值并返回。
随机种子a = 随机数位置 × 随机数位置  ' 防止多次运行结果一样
随机数 = 权分布 [随机数位置]
返回 (随机数)
子程序名返回值类型公开备 注
万级随机数整数型 
变量名类 型静态数组备 注
返回值整数型 
返回值 = 取随机数 (0, 9)取随机数 (0, 9) × 10 + 取随机数 (0, 9) × 100 + 取随机数 (0, 9) × 1000 + 1  ' 在论坛查的,随机数取小数时更加平均分布。
返回 (返回值)


i支持库列表   支持库注释   
spec特殊功能支持库



补充内容 (2023-7-2 02:34):
补充说明:不是生成上万个数据,查看是否符合权重。而是65个样本每天抽10个.因此我的检验方法是:每生成10个数字,随机重置种子,模拟每天变化。

随机数.e

6.75 KB, 下载次数: 2

结果.png

自定义数据类型

自定义数据类型

回答提醒:如果本帖被关闭无法回复,您有更好的答案帮助楼主解决,请发表至 源码区 可获得加分喔。
友情提醒:本版被采纳的主题可在 申请荣誉值 页面申请荣誉值,获得 1点 荣誉值,荣誉值可兑换荣誉会员、终身vip用户组。
快捷通道:申请荣誉值无答案申请取消悬赏投诉有答案未采纳为最佳
结帖率:100% (11/11)

签到天数: 2 天

发表于 2023-7-1 22:17:35 | 显示全部楼层   江苏省南京市
也许可以这样:1 多导入3个,2 导入2个, 3导入1个,然后随机打乱,然后在随机取,这样是不是也算另类的权重了
回复

使用道具 举报

结帖率:100% (7/7)

签到天数: 17 天

发表于 2023-7-1 22:18:20 | 显示全部楼层   广东省茂名市
最简单的方法:按照权重生成一个数组,然后根据数组数量取随机数作为下标
回复

使用道具 举报

结帖率:76% (32/42)

签到天数: 14 天

发表于 2023-7-1 22:22:30 | 显示全部楼层   浙江省湖州市
那你就创建一个数组,用于记录50个数值的出现次数,出现过的数值跳过,每50次重置一下数组
回复

使用道具 举报

结帖率:0% (0/1)
发表于 2023-7-1 23:29:40 | 显示全部楼层   河北省邯郸市
正如xiikcc所说,想符合大概几率,重复添加是个不错的选择。
  
子程序名返回值类型公开备 注
子程序2  
变量名类 型静态数组备 注
随机数池整数型0
i整数型 
k整数型 
随机数整数型 
随机数分布整数型0
概率小数型 
总数文本型 
' 1|1%,2|2%......9|9%,0是剩余
i = 1
k = 0
循环判断首 ()
计次循环首 (i, )
加入成员 (随机数池, i)
k = k + 1
计次循环尾 ()
i = i + 1
循环判断尾 (i < 10)
计次循环首 (100 - k, )
加入成员 (随机数池, 0)
计次循环尾 ()
重定义数组 (随机数分布, 假, 10)
置随机数种子 ()
计次循环首 (1000000, )
随机数 = 取随机数 (1, 100)
如果真 (随机数池 [随机数] = 1)
随机数分布 [1] = 随机数分布 [1] + 1
如果真 (随机数池 [随机数] = 2)
随机数分布 [2] = 随机数分布 [2] + 1
如果真 (随机数池 [随机数] = 3)
随机数分布 [3] = 随机数分布 [3] + 1
如果真 (随机数池 [随机数] = 4)
随机数分布 [4] = 随机数分布 [4] + 1
如果真 (随机数池 [随机数] = 5)
随机数分布 [5] = 随机数分布 [5] + 1
如果真 (随机数池 [随机数] = 6)
随机数分布 [6] = 随机数分布 [6] + 1
如果真 (随机数池 [随机数] = 7)
随机数分布 [7] = 随机数分布 [7] + 1
如果真 (随机数池 [随机数] = 8)
随机数分布 [8] = 随机数分布 [8] + 1
如果真 (随机数池 [随机数] = 9)
随机数分布 [9] = 随机数分布 [9] + 1
如果真 (随机数池 [随机数] = 0)
随机数分布 [10] = 随机数分布 [10] + 1

计次循环尾 ()
计次循环首 (10, i)
概率 = 随机数分布 [i] ÷ 1000000 × 100
总数 = 总数 + 到文本 (概率)选择 (i < 10, “|”, “”)
计次循环尾 ()
调试输出 (总数)


i支持库列表   支持库注释   
spec特殊功能支持库



一百万次循环下来,符合预设概率
20230701232746.png
回复

使用道具 举报

结帖率:100% (2/2)

签到天数: 16 天

发表于 2023-7-2 00:41:25 | 显示全部楼层   贵州省*
实现起来好像不难 关键是要看怎么设计写法 内存占用少 代码也少

点评

添加多个权重更大的到数组里面会增加内存占用 易语言的随机还有大小限制 很多大的数字根本随机不出来的   贵州省*  发表于 2023-7-2 00:43
回复

使用道具 举报

结帖率:0% (0/1)
 楼主| 发表于 2023-7-2 02:18:15 | 显示全部楼层   上海市上海市
美稀宗 发表于 2023-7-1 23:29
正如xiikcc所说,想符合大概几率,重复添加是个不错的选择。
[e=1].版本 2
.支持库 spec

我原本也是这样弄得。。结果有一个问题:虽然运行一万次概率平均,但正常使用时我只需要65个数取10个不重复的。因此我是取十个数,然后重置一次随机数种子(模拟今天取10次,明天在取10次这样的情形),重复几万次,发现就是不平均。
需求场景就好比上课点名,程序正常的,但就是某些人一直不被抽到。。。

点评

别慌 我忙完了 等下给你敲个例子 保证足够简洁   贵州省*  发表于 2023-7-2 05:37
回复

使用道具 举报

结帖率:100% (2/2)

签到天数: 16 天

发表于 2023-7-2 06:46:33 | 显示全部楼层   贵州省*
几何概型求解权重随机

几何概型求解权重随机.e

5.16 KB, 下载次数: 3

几何概型.png
回复

使用道具 举报

结帖率:0% (0/1)
 楼主| 发表于 2023-7-2 10:06:31 | 显示全部楼层   上海市上海市
笨来无一悟 发表于 2023-7-2 06:46
几何概型求解权重随机

大佬,每取10个随机数,随机重置“随机数种子”。(模拟的是今天取10个随机数,明天在取10个随机数),然后反馈的结果就差太多了,

点评

你调用十次 权重随机() 置一次随机数种子不就可以了   贵州省*  发表于 2023-7-2 10:14
回复

使用道具 举报

结帖率:100% (2/2)

签到天数: 16 天

发表于 2023-7-2 12:27:00 | 显示全部楼层   贵州省*
胖KK 发表于 2023-7-2 10:06
大佬,每取10个随机数,随机重置“随机数种子”。(模拟的是今天取10个随机数,明天在取10个随机数),然 ...

突然懂了 你指的是 某个数设置了百分之1的权重 随机很多很多次 结果出现的次数和你设置的权重不一样?建议你先随机一大堆0到9 看看随机无数次 出现的次数是不是都是十分之一 你搞清楚 这是随机 理论值是理论值 实际情况是实际情况
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则 致发广告者

发布主题 收藏帖子 返回列表

sitemap| 易语言源码| 易语言教程| 易语言论坛| 易语言模块| 手机版| 广告投放| 精易论坛
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表精易立场!
论坛帖子内容仅用于技术交流学习和研究的目的,严禁用于非法目的,否则造成一切后果自负!如帖子内容侵害到你的权益,请联系我们!
防范网络诈骗,远离网络犯罪 违法和不良信息举报电话0663-3422125,QQ: 793400750,邮箱:wp@125.la
Powered by Discuz! X3.4 揭阳市揭东区精易科技有限公司 ( 粤ICP备12094385号-1) 粤公网安备 44522102000125 增值电信业务经营许可证 粤B2-20192173

快速回复 返回顶部 返回列表