精易论坛

标题: 取不重复随机数,较少代码量实现 [打印本页]

作者: remained5    时间: 2024-7-30 14:12
标题: 取不重复随机数,较少代码量实现
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
子程序名返回值类型公开备 注
__启动窗口_创建完毕  
变量名类 型静态数组备 注
检验循环_计次整数型 
已取数字数组整数型0
取随机数循环_计次整数型 
随机数整数型 
置随机数种子 ()
判断循环首 (取数组成员数 (已取数字数组) ≠ 20)
随机数 = 取随机数 (1, 20)
加入成员 (已取数字数组, 随机数)
计次循环首 (取数组成员数 (已取数字数组) - 1, 检验循环_计次)
如果真 (检验循环_计次 ≤ 取数组成员数 (已取数字数组))
如果真 (随机数 = 已取数字数组 [检验循环_计次])
删除成员 (已取数字数组, 检验循环_计次, )


计次循环尾 ()
判断循环尾 ()


作者: 笨来无一悟    时间: 2024-7-30 14:52
有限范围 最快的写法是交换变量 不限范围的 就比较麻烦了
作者: fire9    时间: 2024-7-30 16:35
                    
作者: 福仔    时间: 2024-7-30 17:21
可以利用哈希函数的规则来处理
要获取多少个随机数已经是确认了的
那就定义这么长一个数组, 每次获  取随机数() % 成员数 得到数组下标
每次获取都判断这个成员有没有被设置值, 没有的话就设置, 然后填充成员数+1
直到填充的成员数和成员数相等, 循环退出
这样就得到了不重复的随机数, 效率也比你这个方法要高
作者: 福仔    时间: 2024-7-30 17:30
福仔 发表于 2024-7-30 17:21
可以利用哈希函数的规则来处理
要获取多少个随机数已经是确认了的
那就定义这么长一个数组, 每次获  取随机 ...
  
子程序名返回值类型公开备 注
_临时子程序  
变量名类 型静态数组备 注
arr整数型0
置随机数种子 ()
取不重复随机数 (20, -100, -1, arr)
调试输出 (arr)
子程序名返回值类型公开备 注
取不重复随机数整数型 
参数名类 型参考可空数组备 注
获取数量整数型
最小值整数型
最大值整数型
返回数组整数型
变量名类 型静态数组备 注
i整数型 
填充数整数型 
随机数整数型 
下标整数型 
重定义数组 (返回数组, 假, 获取数量)
计次循环首 (获取数量, i)
返回数组 [i] = 最小值 - 1
计次循环尾 ()
判断循环首 (填充数 < 获取数量)
随机数 = 取随机数 (, )�� (最大值 - 最小值 + 1)
随机数 = 随机数 + 最小值
下标 = 取绝对值 (随机数 % 获取数量) + 1
如果真 (返回数组 [下标] = 最小值 - 1)
返回数组 [下标] = 随机数
填充数 = 填充数 + 1

判断循环尾 ()
返回 (0)


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

作者: 卡卡1111    时间: 2024-7-30 18:08
支持开源~!感谢分享
作者: remained5    时间: 2024-7-30 19:57
福仔 发表于 2024-7-30 17:21
可以利用哈希函数的规则来处理
要获取多少个随机数已经是确认了的
那就定义这么长一个数组, 每次获  取随机 ...

emm好高深,我研究研究,谢谢大佬
作者: 逆神者一方    时间: 2024-7-30 20:04
求ide字体
作者: remained5    时间: 2024-7-30 20:06
福仔 发表于 2024-7-30 17:30
[e=1]
.版本 2
.支持库 spec

大佬,我有个问题,就是按照您的写法,假如我想从1-100的数字中取5个,倘若抽出的数字为99,98 那这两个数整除5的结果相同,那只会保留第一个数字,这样的话不会影响随机的概率吗,这样的话就意味着一定范围内整除数相同的数不能同时出现。
作者: 福仔    时间: 2024-7-30 20:10
remained5 发表于 2024-7-30 20:06
大佬,我有个问题,就是按照您的写法,假如我想从1-100的数字中取5个,倘若抽出的数字为99,98 那这两个 ...

会影响,这个需要处理,你可以弄多一个数组,存放每次的随机数,要是你求出的下标已经存在,那就去那个数组里对比值是不是一样
作者: remained5    时间: 2024-7-30 20:11
逆神者一方 发表于 2024-7-30 20:04
求ide字体

华康方圆体
作者: remained5    时间: 2024-7-30 20:12
笨来无一悟 发表于 2024-7-30 14:52
有限范围 最快的写法是交换变量 不限范围的 就比较麻烦了

求大佬给个例程可以吗,没想明白交换变量如何实现
作者: remained5    时间: 2024-7-30 20:15
福仔 发表于 2024-7-30 20:10
会影响,这个需要处理,你可以弄多一个数组,存放每次的随机数,要是你求出的下标已经存在,那就去那个数 ...

啊啊啊明白了,那如果就是既求余也整除的话,这样应该可以避免这种问题

作者: ZHuanR    时间: 2024-7-30 20:47
新技能已get√
作者: 笨来无一悟    时间: 2024-7-30 21:02
remained5 发表于 2024-7-30 20:12
求大佬给个例程可以吗,没想明白交换变量如何实现

一千万以内的不重复随机数可以这样 再多的也可以 但是空间占用会比较多 一个整数占4个字节 自己算空间换时间 这样直接交换位置 就不需要判断重不重复了
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
变量名类 型数组备 注
小范围随机数整数型10000 

子程序名返回值类型公开备 注
__启动窗口_创建完毕  
变量名类 型静态数组备 注
计次整数型 
返回结果整数型0
计次循环首 (取数组成员数 (小范围随机数), 计次)
小范围随机数 [计次] = 计次
计次循环尾 ()
取不重复随机数 (20, 返回结果)
调试输出 (返回结果)
子程序名返回值类型公开备 注
取不重复随机数  
参数名类 型参考可空数组备 注
个数整数型
结果整数型
变量名类 型静态数组备 注
计次整数型 
总数整数型 
总数 = 取数组成员数 (小范围随机数)
置随机数种子 ()
计次循环首 (总数, 计次)
交换变量 (小范围随机数 [计次], 小范围随机数 [取随机数 (1, 总数)])
计次循环尾 ()
结果 = 小范围随机数
重定义数组 (结果, 真, 个数)


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


作者: remained5    时间: 2024-7-30 21:10
笨来无一悟 发表于 2024-7-30 21:02
一千万以内的不重复随机数可以这样 再多的也可以 但是空间占用会比较多 一个整数占4个字节 自己算{:6_418 ...

啊啊啊,明白了,这个就相当于弄了个数表,数字小的话确实很快,不过对于这个数组来说确实也比较占内存,谢谢大佬分享
作者: ttggnn    时间: 2024-7-30 21:38
感谢分享,很给力!~
作者: 查过    时间: 2024-7-31 07:19
感谢分享,很给力!~
作者: 豆豆灰常开心    时间: 2024-7-31 07:24
已经顶贴,感谢您对论坛的支持!
作者: year1970    时间: 2024-7-31 08:43
感谢分享
作者: 396384183    时间: 2024-7-31 09:59

支持开源!感谢分享
作者: 红尘一粟    时间: 2024-7-31 10:10
刚开始学习易语言,过来学习下。
作者: remained5    时间: 2024-7-31 13:19
笨来无一悟 发表于 2024-7-30 21:02
一千万以内的不重复随机数可以这样 再多的也可以 但是空间占用会比较多 一个整数占4个字节 自己算{:6_418 ...

不对,大佬,今天我又看了一下,您这个代码在交换变量时,小范围随机数的下标有可能取到相同的,这样不就又有重复的了吗
作者: 笨来无一悟    时间: 2024-7-31 13:58
本帖最后由 笨来无一悟 于 2024-7-31 14:07 编辑

只追求速度 不考虑空间占用 这样速度比较快
  
窗口程序集名保 留  保 留备 注
窗口程序集_启动窗口   
变量名类 型数组备 注
小范围随机数整数型10000 

子程序名返回值类型公开备 注
__启动窗口_创建完毕  
变量名类 型静态数组备 注
计次整数型 
返回结果整数型0
计次循环首 (取数组成员数 (小范围随机数), 计次)
小范围随机数 [计次] = 计次
计次循环尾 ()
取不重复随机数 (20, 返回结果)
调试输出 (返回结果)
子程序名返回值类型公开备 注
取不重复随机数  
参数名类 型参考可空数组备 注
个数整数型
结果整数型
变量名类 型静态数组备 注
计次整数型 
总数整数型 
总数 = 取数组成员数 (小范围随机数)
置随机数种子 ()
计次循环首 (个数, 计次)
交换变量 (小范围随机数 [计次], 小范围随机数 [取随机数 (1, 总数)])
计次循环尾 ()
结果 = 小范围随机数
重定义数组 (结果, 真, 个数)


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

作者: aa2976    时间: 2024-7-31 23:21

感谢分享,
作者: 光影魔术    时间: 2024-8-1 14:29
感谢分享源码
作者: aa6536    时间: 2024-8-4 21:53
#在这里快速回复#开源精神必须支持~
作者: remained5    时间: 2024-8-10 16:47
笨来无一悟 发表于 2024-7-31 13:58
只追求速度 不考虑空间占用 这样速度比较快
[e=4].版本 2
.支持库 spec

学习了,谢谢大佬

作者: 1326554131    时间: 2024-8-11 08:27
感谢分享,支持开源!!!
作者: hzhz5201    时间: 2024-8-27 14:41
本帖最后由 hzhz5201 于 2024-8-27 14:42 编辑

纯小白刚学易语言,感谢楼主分享源码。小白恳请楼主附加一下调用例子
作者: remained5    时间: 2024-8-30 15:02
hzhz5201 发表于 2024-8-27 14:41
纯小白刚学易语言,感谢楼主分享源码。小白恳请楼主附加一下调用例子 ...

这个好像没什么大用,或许按照学号排序什么的可以用到吧

作者: 熊不熊    时间: 2024-12-4 21:25
感谢分享,很给力!~




欢迎光临 精易论坛 (https://125.confly.eu.org/) Powered by Discuz! X3.4