本帖最后由 小白弟弟 于 2024-7-6 20:06 编辑
懒得截图了,效果大概是这样:
* 7
* 2
* 3
* 10
* 8
* 9
* 5
* 6
* 4
* 1
被调试易程序运行完毕
* 7
* 1
* 5
* 6
* 8
* 4
* 9
* 2
* 10
* 3
被调试易程序运行完毕
思路比较笨,暴力做法,时间较慢,理论支持无限大的数(转化文本就行,高精度比较麻烦,为了方便学习就没添加了)
大概讲讲思路吧,随机取随机数,判断是否出现过,真就无限循环,循环次数超过随机数范围10倍时,大概率是取不出来了(可能运气比较背,不一定标准,目前没想到更好的解决方案)
底层实现用了map(所以才可以支持无限大的数)
由于本人技术有限,不会红黑树,就转用C++写主要程序了,见谅!当然,源码也有易语言的,下面提供的压缩包就是易语言实例希望有大佬可以实现用易语言实现map,也就是红黑树,那就很方便了
取不重复随机数.zip
(796.49 KB, 下载次数: 23)
想法出自本帖
取不重复随机数_精易论坛 (125.la)
速度较慢,无聊想出来的
主要dll源码
[C++] 纯文本查看 复制代码 map<int, bool> mp;
vector<int> vis;
DLLIMPORT int Rand (int L, int R)
{
double base=((double)rand())/RAND_MAX;
int res=L+(base*(double)(R-L+1));
return res;
}
DLLIMPORT int __stdcall NonRepeatingRandom(int L, int R, bool clear)
{
int cnt=0;
if (clear)
{
for (int i=0; i<vis.size(); i++) mp[vis]=0;
vis.clear();
}
int k=Rand(L, R);
while (mp[k])
{
k=Rand(L, R);
cnt++;
if (cnt>(R-L+1)*10) return -1;
}
mp[k]=1;
vis.push_back(k);
return k;
}
|