开启辅助访问 切换到宽版

精易论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

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

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


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

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

查看: 689|回复: 48
收起左侧

[闲聊] 啊啊啊啊啊啊啊啊啊啊啊啊啊啊

[复制链接]

结帖率:100% (18/18)
发表于 2024-6-13 21:57:31 | 显示全部楼层 |阅读模式   福建省泉州市
要疯了……脑袋爆炸
陆续看到论坛有关于取超长随机数的帖子
都没有一个很好的答案,汇编_取随机数_硬件版()又不支持部分cpu
本想试着写一个取超长范围随机数的子程序
开始还好
结果越写bug越多,逻辑越捋不清楚了
难受了   




点评

无意义标题,紫菜8   浙江省台州市  发表于 2024-6-22 17:35

结帖率:95% (18/19)

签到天数: 24 天

发表于 2024-6-13 23:51:17 | 显示全部楼层   湖北省武汉市
  
' 简化了一下,这样也可以
子程序名返回值类型公开备 注
取随机数_长整长整数型 
参数名类 型参考可空数组备 注
最小值长整数型
最大值长整数型
变量名类 型静态数组备 注
随机值文本型 
最低位数整数型 
最高位数整数型 
随机一位整数型 
随机单位整数型 
i整数型 
返回值长整数型 
如果真 (最小值 = 最大值)
返回 (0)
置随机数种子 ()
最低位数 = 取文本长度 (到文本 (最小值))
最高位数 = 取文本长度 (到文本 (最大值))
循环判断首 ()
随机一位 = 取随机数 (最低位数, 最高位数)
随机值 = “”
计次循环首 (随机一位, i)
随机单位 = 取随机数 (0, 9)
如果真 (取反 (i = 1 随机单位 = 0))
随机值 = 随机值 + 到文本 (随机单位)

计次循环尾 ()
返回值 = 到长整数 (随机值)
循环判断尾 (取反 (返回值 ≥ 最小值 返回值 ≤ 最大值))
返回 (返回值)

点评

我想填个 (1000010,1000020),让你死循环,能否结束循环给出结果全看脸   福建省泉州市  发表于 2024-6-14 00:04
计次循环里面的如果真也可以删掉,不管前面是否全是0,全组进去就行,转数值的时候前面的0会被自动清除   福建省泉州市  发表于 2024-6-14 00:00
第一个如果真的条件里,等号改成≤会好一点   福建省泉州市  发表于 2024-6-13 23:58
回复 支持 1 反对 0

使用道具 举报

结帖率:100% (2/2)

签到天数: 10 天

发表于 2024-6-15 00:01:38 | 显示全部楼层   贵州省毕节市
本帖最后由 笨来无一悟 于 2024-6-15 00:12 编辑

原理和之前的百分比写法类似 那个写法 取出最大值的概率比其他值的概率低一些 截取区间的递归写法 概率相等
随机百分比的只能精确到0.9999999999 最大减最小 大于 9999999999 的时候 取出最大值的概率经常是0

手动赋值0.9999999999做过测试 可以改成没有BUG的 但是没必要改了 直接递归的写法代码量更少 并且一切正常

  
子程序名返回值类型公开备 注
递归随机长整数型 
参数名类 型参考可空数组备 注
最大长整数型
最小长整数型
变量名类 型静态数组备 注
区间整数型每次 10 等分
区间 = 取随机数 (0, 9)  ' 因为递归调用 通常时差很短 置随机数种子( ) 不能写在 递归随机( ) 子程序之内
如果真 (最大 < 最小)
交换变量 (最大, 最小)
如果真 (最大 - 最小 < 65432)
返回 (最小 + 取随机数 (0, 最大 - 最小))  ' [ 65536 ]
返回 (递归随机 (最小 (最大 - 最小) ÷ 10 (区间 + 1), 最小 (最大 - 最小) ÷ 10 × 区间))


点评

百分比的写法 差值太大 取出最大值的 理论概率就是0了 别的数都正常 因为除法赋值给整数向下舍入导致 最大值成为了最大值-1 区间的这个0到8包对   贵州省毕节市  发表于 2024-6-15 00:27
乱码???=" + " 乱码??=" × "   贵州省毕节市  发表于 2024-6-15 00:23
怀疑特定情况会有漏网之鱼,回头我再改改,嘿嘿;思路大方向是没错的   福建省泉州市  发表于 2024-6-15 00:17
回复 支持 反对

使用道具 举报

结帖率:95% (84/88)

签到天数: 3 天

发表于 2024-6-16 01:15:15 | 显示全部楼层   泛播地址
ok那这样,我C#有Biginteger。你可以编译一个DLL给易调用。
https://stackoverflow.com/questions/17357760/how-can-i-generate-a-random-biginteger-within-a-certain-range

点评

调用dll太麻烦了点,写个程序还要带个dll,很多人烦这个   福建省泉州市  发表于 2024-6-16 01:20
没必要,已经有可行的思路了,就差闲了完善代码而已,你看置顶楼层的,理论上是可行的   福建省泉州市  发表于 2024-6-16 01:19
回复 支持 反对

使用道具 举报

结帖率:95% (84/88)

签到天数: 3 天

发表于 2024-6-15 13:39:54 | 显示全部楼层   泛播地址
不懂就问:取超长随机数不是一个str,然后几个随机数文本加起来最后parse就好了吗

点评

分段取出的话,长度小的数被取得的概率会大大降低的   福建省泉州市  发表于 2024-6-15 15:03
主要考虑一个范围问题,比如取0到1000000,要确保位数低的也有同样概率被取出   福建省泉州市  发表于 2024-6-15 15:02
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)

签到天数: 10 天

发表于 2024-6-15 02:11:35 | 显示全部楼层   贵州省毕节市
没有防呆设计 每次100等分的 面对超大区间跨度的时候性能表现会更好 范围比较窄的时候 差别不大
  
子程序名返回值类型公开备 注
递归随机长整数型 
参数名类 型参考可空数组备 注
最大长整数型乱填
最小长整数型乱填
变量名类 型静态数组备 注
区间整数型每次 10 等分
区间 = 取随机数 (0, 9)  ' 因为递归调用 通常时差很短 置随机数种子( ) 不能写在 递归随机( ) 子程序之内
如果真 (最大 < 最小)  ' 防
交换变量 (最大, 最小)  ' 呆
如果真 (最大 - 最小 < 65432)
返回 (最小 + 取随机数 (0, 最大 - 最小))  ' [ 65536 ]
返回 (递归随机 (最小 (最大 - 最小) ÷ 10 (区间 + 1), 最小 (最大 - 最小) ÷ 10 × 区间))
子程序名返回值类型公开备 注
递归随机长整数型 无防呆设计 请严格检查 最大 是否 大于 最小
参数名类 型参考可空数组备 注
最大长整数型严格检查 大于 ↓
最小长整数型严格检查 小于 ↑
变量名类 型静态数组备 注
区间整数型每次 100 等分
区间 = 取随机数 (0, 99)  ' 因为递归调用 通常时差很短 置随机数种子( ) 不能写在 递归随机( ) 子程序之内
如果真 (最大 - 最小 < 65432)
返回 (最小 + 取随机数 (0, 最大 - 最小))  ' [ 65536 ]
返回 (递归随机 (最小 (最大 - 最小) ÷ 100 (区间 + 1), 最小 (最大 - 最小) ÷ 100 × 区间))

回复 支持 反对

使用道具 举报

结帖率:100% (2/2)

签到天数: 10 天

发表于 2024-6-15 00:38:29 | 显示全部楼层   贵州省毕节市
只要最大值可以被取出来 其他值就是一定也可以的 具体证明过程就不证明了
没问题.jpg
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)

签到天数: 10 天

发表于 2024-6-15 00:33:39 | 显示全部楼层   贵州省毕节市
测试过了 没有漏网之鱼的 百分比的写法 数值过大的时候 可以随机出任何一个数 唯独随机不出最大值
  
判断循环首 ()
如果真 (递归随机 (123456, 0) = 123456)
调试输出 (“没问题”)
跳出循环 ()

判断循环尾 ()


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

回复 支持 反对

使用道具 举报

结帖率:100% (18/18)

签到天数: 25 天

 楼主| 发表于 2024-6-14 12:33:44 | 显示全部楼层   福建省泉州市
冬夏 发表于 2024-6-13 23:51
[e=1]
.版本 2
' 简化了一下,这样也可以

@冬夏 @笨来无一悟 我好像搞定了

点评

还不快快发出来   贵州省毕节市  发表于 2024-6-14 14:07
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)

签到天数: 10 天

发表于 2024-6-14 03:44:52 | 显示全部楼层   贵州省毕节市
循环多次取出的话 求次方这儿还能多写一个变量循环乘10 速度应该会比次方快些严谨了 代码就多了
  
子程序名返回值类型公开备 注
随机长整数型 
参数名类 型参考可空数组备 注
最小长整数型
最大长整数型
变量名类 型静态数组备 注
占比双精度小数型 
计次整数型 
计次循环首 (10, 计次)
占比 = 占比 + 取随机数 (0, 9) ÷ 求次方 (10, 计次)
计次循环尾 ()
最大 = 最大 - 最小 + 1
判断 (最大 > 9999999999)
计次 = 最大 ÷ 求次方 (10, 10)
最大 = 最大 - 计次  ' 颗粒度>1时↓进行二次微调
返回 (最小 + 最大 × 占比 + 取随机数 (0, 计次))
返回 (最小 + 最大 × 占比)  ' 颗粒度≤ 1时无需微调


点评

大小差值>9999999999时 随机到最大值的概率 经常理论上就是0了(别的数都正常 就唯一一个最大值 除法舍入导致的问题 ) 要修复还得加判断 直接改用递归   贵州省毕节市  发表于 2024-6-15 00:18
假设 计次 = 最大 ÷ 求次方 (10, 10) 颗粒度算出来是5 不微调的话 就是数轴上一次移动5格 随机移动N次 随机+一个 取随机数(0,颗粒度) 修正数与数的间隙   贵州省毕节市  发表于 2024-6-14 04:00
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)

签到天数: 10 天

发表于 2024-6-14 03:04:45 | 显示全部楼层   贵州省毕节市
颗粒度足够细了 效率比较低值比较大的情况还可以在计算之后 再执行一次 0到最小颗粒度 随机加减 这样就可以确保 任意一个数 都是有可能被选中的
  
子程序名返回值类型公开备 注
随机长整数型 
参数名类 型参考可空数组备 注
最小长整数型
最大长整数型
变量名类 型静态数组备 注
占比双精度小数型 
计次整数型 
计次循环首 (10, 计次)
占比 = 占比 + 取随机数 (0, 9) ÷ 求次方 (10, 计次)
计次循环尾 ()
返回 (最小 (最大 - 最小 + 1) × 占比)  ' 取值范围 0 - 0.9999999999 由于永远不可能取到 1 也就是 100% 于是手动 + 1


点评

最大 减 最小 小于等于 9999999999 (10个9)的情况 以上代码都是可以确保任何一个数理论上都可以被随机出来 大于10个9的情况 需要再执行一次 取随加减   贵州省毕节市  发表于 2024-6-14 03:08
回复 支持 反对

使用道具 举报

结帖率:100% (2/2)

签到天数: 10 天

发表于 2024-6-14 02:11:20 | 显示全部楼层   贵州省毕节市
颗粒度改成随机的了 如果65536只能都没问题的话 颗粒 = 取随机数 (100, 10000) 改成 颗粒 = 取随机数 (100, 65536) 更好 有BUG再反馈
  
子程序名返回值类型公开备 注
随机长整数型 
参数名类 型参考可空数组备 注
最小长整数型
最大长整数型
变量名类 型静态数组备 注
颗粒整数型 
颗粒 = 取随机数 (100, 10000)
返回 (最小 (最大 - 最小) ÷ 颗粒 × 取随机数 (0, 颗粒))

回复 支持 反对

使用道具 举报

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

本版积分规则 致发广告者

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

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

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