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

下标 =
取绝对值 (随机数 % 获取数量
) + 1

如果真 (返回数组
[下标
] = 最小值 - 1
)

返回数组
[下标
] = 随机数


填充数 = 填充数 + 1


判断循环尾 ()返回 (0
)
作者: 卡卡1111 时间: 2024-7-30 18:08
支持开源~!感谢分享
作者: remained5 时间: 2024-7-30 19:57
emm好高深,我研究研究,谢谢大佬
作者: 逆神者一方 时间: 2024-7-30 20:04
求ide字体
作者: remained5 时间: 2024-7-30 20:06
大佬,我有个问题,就是按照您的写法,假如我想从1-100的数字中取5个,倘若抽出的数字为99,98 那这两个数整除5的结果相同,那只会保留第一个数字,这样的话不会影响随机的概率吗,这样的话就意味着一定范围内整除数相同的数不能同时出现。
作者: 福仔 时间: 2024-7-30 20:10
会影响,这个需要处理,你可以弄多一个数组,存放每次的随机数,要是你求出的下标已经存在,那就去那个数组里对比值是不是一样
作者: remained5 时间: 2024-7-30 20:11
华康方圆体
作者: remained5 时间: 2024-7-30 20:12
求大佬给个例程可以吗,没想明白交换变量如何实现
作者: remained5 时间: 2024-7-30 20:15
啊啊啊明白了,那如果就是既求余也整除的话,这样应该可以避免这种问题
作者: ZHuanR 时间: 2024-7-30 20:47
新技能已get√
作者: 笨来无一悟 时间: 2024-7-30 21:02
一千万以内的不重复随机数可以这样 再多的也可以 但是空间占用会比较多 一个整数占4个字节 自己算
空间换时间 这样直接交换位置 就不需要判断重不重复了
窗口程序集名 | 保 留 | 保 留 | 备 注 |
窗口程序集_启动窗口 | | | |
变量名 | 类 型 | 数组 | 备 注 |
小范围随机数 | 整数型 | 10000 |
变量名 | 类 型 | 静态 | 数组 | 备 注 |
计次 | 整数型 | | |
返回结果 | 整数型 | | 0 |
计次循环首 (取数组成员数 (小范围随机数
), 计次
)
小范围随机数
[计次
] = 计次
计次循环尾 ()取不重复随机数 (20, 返回结果
)调试输出 (返回结果
)总数 =
取数组成员数 (小范围随机数
)置随机数种子 ()
计次循环首 (总数, 计次
)
交换变量 (小范围随机数
[计次
], 小范围随机数
[取随机数 (1, 总数
)])
计次循环尾 ()结果 = 小范围随机数
重定义数组 (结果, 真, 个数
)
作者: remained5 时间: 2024-7-30 21:10
啊啊啊,明白了,这个就相当于弄了个数表,数字小的话确实很快,不过对于这个数组来说确实也比较占内存,谢谢大佬分享
作者: 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-31 13:58
本帖最后由 笨来无一悟 于 2024-7-31 14:07 编辑
只追求速度 不考虑空间占用 这样速度比较快
窗口程序集名 | 保 留 | 保 留 | 备 注 |
窗口程序集_启动窗口 | | | |
变量名 | 类 型 | 数组 | 备 注 |
小范围随机数 | 整数型 | 10000 |
变量名 | 类 型 | 静态 | 数组 | 备 注 |
计次 | 整数型 | | |
返回结果 | 整数型 | | 0 |
计次循环首 (取数组成员数 (小范围随机数
), 计次
)
小范围随机数
[计次
] = 计次
计次循环尾 ()取不重复随机数 (20, 返回结果
)调试输出 (返回结果
)总数 =
取数组成员数 (小范围随机数
)置随机数种子 ()
计次循环首 (个数, 计次
)
交换变量 (小范围随机数
[计次
], 小范围随机数
[取随机数 (1, 总数
)])
计次循环尾 ()结果 = 小范围随机数
重定义数组 (结果, 真, 个数
)
作者: aa2976 时间: 2024-7-31 23:21
感谢分享,
作者: 光影魔术 时间: 2024-8-1 14:29
感谢分享源码
作者: aa6536 时间: 2024-8-4 21:53
#在这里快速回复#开源精神必须支持~
作者: remained5 时间: 2024-8-10 16:47
学习了,谢谢大佬
作者: 1326554131 时间: 2024-8-11 08:27
感谢分享,支持开源!!!
作者: hzhz5201 时间: 2024-8-27 14:41
本帖最后由 hzhz5201 于 2024-8-27 14:42 编辑
纯小白刚学易语言,感谢楼主分享源码。
小白恳请楼主附加一下调用例子
作者: remained5 时间: 2024-8-30 15:02
这个好像没什么大用,或许按照学号排序什么的可以用到吧
作者: 熊不熊 时间: 2024-12-4 21:25
感谢分享,很给力!~
欢迎光临 精易论坛 (https://125.confly.eu.org/) |
Powered by Discuz! X3.4 |