作者:mobiledu2502894873 | 来源:互联网 | 2023-05-17 12:29
我想随机取出1000个数字,这1000个数字都小于或等于10000,且不能重复。要求有很大的随机性,我的思路是通过随机函数从10000里取出一个值,然后接着用随机函数从9999个数字里取值,如此类推。
我想随机取出1000个数字,这1000个数字都小于或等于10000,且不能重复。要求有很大的随机性,我的思路是通过随机函数从10000里取出一个值,然后接着用随机函数从9999个数字里取值,如此类推。这样就有很大的随机性,不知可行?但这个方法的具体代码我却不知该如何来写。大家能告诉我吗,谢谢。!!!!!!
27 个解决方案
定义一个数组10000
for ii = 1 to upperboun 数组
数组[ii] = rand[1000]
next
你试试!
你的思路是正确的,具体代码并不困难,建立数组每次重置即可
采用洗牌的思路,把10000个数作为数组,随机交换牌的位置,然后取出前1000个就行了
定义一个数组a[10000]
long l_temp,l_rand
for i = 1 to 10000
l_rand = rand(10000)
l_temp = a[i]
a[i] = a[l_rand]
a[l_rand] = l_temp
next
从a[1] 到 a[1000]就是1000个随机且不重复的数了
同意 回复人: shijizhi(野麦子) ( ) 信誉:100 !!
不是很明白(野麦子)的原理,如果楼主也不明就不要用了
同意野麦子
在前面加上
for i=1 to 10000
a[i] = i
next
然后再洗牌,再取前一千个
就是速度慢点
个人观点:不用数组,用数据存储,数据窗口对象外部数据源,就一个列,long型,名称a
直接用randomize(10000)取,
的到的值首先用find在数据存储中查找,有则继续循环,没有则加入数据存储
long ll_sum//要取得的个数
long ll_max//要取得的上限
long ll_curr//当前取道的值
long ll_find
ds_1.reset()
do while ds_1.rowcount() if ll_max messagebox('','取随机数错误')
exit//防止变量设置错误造成死循环
end if
ll_curr=randomize(ll_max)
ll_find=ds_1.find("a="+string(ll_curr),1,ds_a.rowcount())
if ll_find<1 then
//是新的随机数才加入
ds_1.object.aa[ds_1.rowcount()+1]=ll_curr
end if
loop
取ds_1的所有数据就可以了
---------------------------------------------------------------------------------
采用洗牌的思路,把10000个数作为数组,随机交换牌的位置,然后取出前1000个就行了
定义一个数组a[10000]
long l_temp,l_rand
for i = 1 to 10000
l_rand = rand(10000)
l_temp = a[i]
a[i] = a[l_rand]
a[l_rand] = l_temp
next
从a[1] 到 a[1000]就是1000个随机且不重复的数了
楼主,你的思路有问题,第二步根本就是多余的,因为第一步就是随机了,第二步随机没有任何意义你只需rand(9999)就ok
to muzikuhai(啸寒)
直接用rand取,你连续取几次看看,每次的结果都是一样的 :(
用randomize就不能保证取1000次都不重复,因为randomize每次取之前都重新选了随机数序列
integer m
for m= 1 to 1000
messagebox('',string(a[m]))
next
请楼上测试
佩服一下 shijizhi(野麦子) 的思路,楼上的也对:)
tmxkdldw(tmxkdldw) :
引用:
同意野麦子
在前面加上
for i=1 to 10000
a[i] = i
next
然后再洗牌,再取前一千个
引用结束
------------------------------------
注意:先给数祖赋值,提供方法不等于提供全部源代码
别太懒了,该自己写的要自己写,
要不你都没有定义i,你的程序都运行不起来
采用洗牌的思路
经过测试 第一組隨機 4,78,23,41,22,33,77,59,90,65......
第二組隨機 4,78,23,41,22,33,77,59,90,65......
第三組隨機 4,78,23,41,22,33,77,59,90,65......
隨機值一樣,不知道樓上的有沒有類似的現象,有沒有其它的算法呢?
采用洗牌的思路
经过测试 第一組隨機 4,78,23,41,22,33,77,59,90,65......
第二組隨機 4,78,23,41,22,33,77,59,90,65......
第三組隨機 4,78,23,41,22,33,77,59,90,65......
隨機值一樣,不知道樓上的有沒有類似的現象,有沒有其它的算法呢?
-------------------------------------------
使用随机函数的时候,注意rand和Randomize 的区别,具体看PB的帮助
用rand函數 sample
long l_temp,l_rand,i,a[100]
for i = 1 to 100
a[i] = i
next
for i = 1 to 100
l_rand = rand(100)
l_temp = a[i]
a[i] = a[l_rand]
a[l_rand] = l_temp
next
经过测试 第一組隨機 4,78,23,41,22,33,77,59,90,65......
第二組隨機 4,78,23,41,22,33,77,59,90,65......
第三組隨機 4,78,23,41,22,33,77,59,90,65......
个人观点:不用数组,用数据存储,数据窗口对象外部数据源,就一个列,long型,名称a
直接用randomize(10000)取,
的到的值首先用find在数据存储中查找,有则继续循环,没有则加入数据存储
long ll_sum//要取得的个数
long ll_max//要取得的上限
long ll_curr//当前取道的值
long ll_find
ds_1.reset()
do while ds_1.rowcount() if ll_max messagebox('','取随机数错误')
exit//防止变量设置错误造成死循环
end if
ll_curr=randomize(ll_max)
ll_find=ds_1.find("a="+string(ll_curr),1,ds_a.rowcount())
if ll_find<1 then
//是新的随机数才加入
ds_1.object.aa[ds_1.rowcount()+1]=ll_curr
end if
loop
取ds_1的所有数据就可以了
使用randomize代替rand,实际应用中没有谁会用rand
randomize每次都重新开始一个新的序列,加入了系统时间作为参照,不会每次取到的都一样。
我认为用数据存储的方法比洗牌好,用PB就尽量发挥数据窗口的优势,这样做速度要快得多,大概时间只有洗牌法的( 要取随机数数量/随机数上限)倍,具体到楼主的问题,就是时间消耗为洗牌法的1000/10000=1/10
另外,如果取出的随机数需要排序,数据存储(窗口)就比数组更容易草做了
怎麼我測試你的code是個死循環呢?
問題出在ll_curr=randomize(ll_max)語句,
ll_curr始終得到1,為什麼呀?
写错了,要通过randomize指定每几次重新使用新的随机数序列,然后用rand取随机数
不用数组,用数据存储,数据窗口对象外部数据源,就一个列,long型,名称a
直接用randomize(10000)取,
的到的值首先用find在数据存储中查找,有则继续循环,没有则加入数据存储
如下:
//=====================================================================
long ll_sum//要取得的个数
long ll_max//要取得的上限
long ll_curr//当前取道的值
long ll_find
ll_sum=1000
ll_max=10000
ds_1.reset()
randomize(0)
do while ds_1.rowcount() yield()
if ll_max messagebox('','取随机数错误')
exit//防止变量设置错误造成死循环
end if
ll_curr=rand(ll_max)
ll_find=ds_1.find("a="+string(ll_curr),1,ds_1.rowcount())
if ll_find<1 then
//是新的随机数才加入
ds_1.object.a[ds_1.rowcount()+1]=ll_curr
end if
loop
long l_temp,l_rand,i,a[100]
for i = 1 to 100
a[i] = i
next
randomize(0)
for i = 1 to 100
l_rand = rand(100)
l_temp = a[i]
a[i] = a[l_rand]
a[l_rand] = l_temp
next
经过测试 第一組隨機 32,7,70,96,38,23,21,49,3,62......
第二組隨機 36,54,31,18,8,69,95,23,38,79......
第三組隨機 80,34,8,99,85,46,29,25,13,15......
费了很大的劲,帮你调试出来了,完全通用的算法,楼上一些网友的算法,在m,n很接近的情况下效率较低,因为会多次计算出重复数值,本算法保证没有任何重复工作:
用m. n代替1000,10000,可以直接修改m,n,这样调整更加方便。
Integer m = 1000, n = 10000
Integer i, j, k, temp[], num[]
for i = 1 to n
num[i] = i
next
Randomize(0)
for i = 1 to m
k = Rand(n - i + 1)
temp[i] = num[k]
for j = k to n - i
num[j] = num[j + 1]
next
next