热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

请教一随机函数

我想随机取出1000个数字,这1000个数字都小于或等于10000,且不能重复。要求有很大的随机性,我的思路是通过随机函数从10000里取出一个值,然后接着用随机函数从9999个数字里取值,如此类推。
我想随机取出1000个数字,这1000个数字都小于或等于10000,且不能重复。要求有很大的随机性,我的思路是通过随机函数从10000里取出一个值,然后接着用随机函数从9999个数字里取值,如此类推。这样就有很大的随机性,不知可行?但这个方法的具体代码我却不知该如何来写。大家能告诉我吗,谢谢。!!!!!!

27 个解决方案

#1


定义一个数组10000
for ii = 1 to upperboun 数组
     数组[ii] = rand[1000]
next
你试试!

#2


你的思路是正确的,具体代码并不困难,建立数组每次重置即可

#3


采用洗牌的思路,把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个随机且不重复的数了



#4


嗯,楼上的办法挺好。

#5


同意 回复人: shijizhi(野麦子) ( ) 信誉:100 !!

#6


不是很明白(野麦子)的原理,如果楼主也不明就不要用了

#7


不要搞那么复杂,搞简单的就好

#8


我也不明白,麦子这样做的结果全是0呀!

#9


同意野麦子
在前面加上
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个随机且不重复的数了

#10


楼主,你的思路有问题,第二步根本就是多余的,因为第一步就是随机了,第二步随机没有任何意义你只需rand(9999)就ok

#11


to  muzikuhai(啸寒) 
直接用rand取,你连续取几次看看,每次的结果都是一样的  :(

用randomize就不能保证取1000次都不重复,因为randomize每次取之前都重新选了随机数序列

#12


采用洗牌的思路 
经过测试 没有一个是正确的

#13


楼上瞎扯

#14


integer m
for m= 1 to 1000
  messagebox('',string(a[m]))
next

请楼上测试

#15


佩服一下 shijizhi(野麦子) 的思路,楼上的也对:)

#16


tmxkdldw(tmxkdldw) :
引用:
同意野麦子
在前面加上
for i=1 to 10000
a[i] = i
next
然后再洗牌,再取前一千个
引用结束
------------------------------------
注意:先给数祖赋值,提供方法不等于提供全部源代码
别太懒了,该自己写的要自己写,
要不你都没有定义i,你的程序都运行不起来

#17


说的好。

#18


采用洗牌的思路 
经过测试 第一組隨機 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......
隨機值一樣,不知道樓上的有沒有類似的現象,有沒有其它的算法呢?

#19


采用洗牌的思路 
经过测试 第一組隨機 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的帮助

#20


用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......

#21


个人观点:不用数组,用数据存储,数据窗口对象外部数据源,就一个列,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的所有数据就可以了

#22


使用randomize代替rand,实际应用中没有谁会用rand
randomize每次都重新开始一个新的序列,加入了系统时间作为参照,不会每次取到的都一样。
我认为用数据存储的方法比洗牌好,用PB就尽量发挥数据窗口的优势,这样做速度要快得多,大概时间只有洗牌法的( 要取随机数数量/随机数上限)倍,具体到楼主的问题,就是时间消耗为洗牌法的1000/10000=1/10

另外,如果取出的随机数需要排序,数据存储(窗口)就比数组更容易草做了

#23


怎麼我測試你的code是個死循環呢?
問題出在ll_curr=randomize(ll_max)語句,
ll_curr始終得到1,為什麼呀?

#24


写错了,要通过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

#25


thanks!

#26


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......

#27


费了很大的劲,帮你调试出来了,完全通用的算法,楼上一些网友的算法,在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

推荐阅读
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 第四章高阶函数(参数传递、高阶函数、lambda表达式)(python进阶)的讲解和应用
    本文主要讲解了第四章高阶函数(参数传递、高阶函数、lambda表达式)的相关知识,包括函数参数传递机制和赋值机制、引用传递的概念和应用、默认参数的定义和使用等内容。同时介绍了高阶函数和lambda表达式的概念,并给出了一些实例代码进行演示。对于想要进一步提升python编程能力的读者来说,本文将是一个不错的学习资料。 ... [详细]
  • Android自定义控件绘图篇之Paint函数大汇总
    本文介绍了Android自定义控件绘图篇中的Paint函数大汇总,包括重置画笔、设置颜色、设置透明度、设置样式、设置宽度、设置抗锯齿等功能。通过学习这些函数,可以更好地掌握Paint的用法。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 动态规划算法的基本步骤及最长递增子序列问题详解
    本文详细介绍了动态规划算法的基本步骤,包括划分阶段、选择状态、决策和状态转移方程,并以最长递增子序列问题为例进行了详细解析。动态规划算法的有效性依赖于问题本身所具有的最优子结构性质和子问题重叠性质。通过将子问题的解保存在一个表中,在以后尽可能多地利用这些子问题的解,从而提高算法的效率。 ... [详细]
  • Android JSON基础,音视频开发进阶指南目录
    Array里面的对象数据是有序的,json字符串最外层是方括号的,方括号:[]解析jsonArray代码try{json字符串最外层是 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • 摘要: 在测试数据中,生成中文姓名是一个常见的需求。本文介绍了使用C#编写的随机生成中文姓名的方法,并分享了相关代码。作者欢迎读者提出意见和建议。 ... [详细]
  • 本文介绍了iOS数据库Sqlite的SQL语句分类和常见约束关键字。SQL语句分为DDL、DML和DQL三种类型,其中DDL语句用于定义、删除和修改数据表,关键字包括create、drop和alter。常见约束关键字包括if not exists、if exists、primary key、autoincrement、not null和default。此外,还介绍了常见的数据库数据类型,包括integer、text和real。 ... [详细]
  • This article discusses the efficiency of using char str[] and char *str and whether there is any reason to prefer one over the other. It explains the difference between the two and provides an example to illustrate their usage. ... [详细]
  • 上图是InnoDB存储引擎的结构。1、缓冲池InnoDB存储引擎是基于磁盘存储的,并将其中的记录按照页的方式进行管理。因此可以看作是基于磁盘的数据库系统。在数据库系统中,由于CPU速度 ... [详细]
  • HDU 2372 El Dorado(DP)的最长上升子序列长度求解方法
    本文介绍了解决HDU 2372 El Dorado问题的一种动态规划方法,通过循环k的方式求解最长上升子序列的长度。具体实现过程包括初始化dp数组、读取数列、计算最长上升子序列长度等步骤。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
author-avatar
mobiledu2502894873
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有