数组的随机输出与随机数组的产生

上传人:ldj****22 文档编号:35777895 上传时间:2018-03-20 格式:PDF 页数:6 大小:182.46KB
返回 下载 相关 举报
数组的随机输出与随机数组的产生_第1页
第1页 / 共6页
数组的随机输出与随机数组的产生_第2页
第2页 / 共6页
数组的随机输出与随机数组的产生_第3页
第3页 / 共6页
数组的随机输出与随机数组的产生_第4页
第4页 / 共6页
数组的随机输出与随机数组的产生_第5页
第5页 / 共6页
点击查看更多>>
资源描述

《数组的随机输出与随机数组的产生》由会员分享,可在线阅读,更多相关《数组的随机输出与随机数组的产生(6页珍藏版)》请在金锄头文库上搜索。

1、数组的随机输出,与随机数组的产生 那天群里有位朋友问了一个对给定数组的随机数组的输出问题, 我的第一反应当 然是产生随机数、然后判断是否产生过、然后赋值、最后输出。当然群里其他的 朋友也几乎都是这么想的。我之前也没有认真去想过还有没有其他的解决办法。 但始终觉得这样产生一个再判断比较,太浪费时间了,数组元素少的时候还好, 但数组元素比较多的时候应该就会很“耗时” 对于给定数组 an的随机输出,学过程序的人就很容易想到用一个循环产生 0 (n-1)之间的随机数(设为 T),然后判断这个数字之前是否已经产生过,如 果没有产生就将 aT的值赋给另一个与 a 数组元素相等的数组(设为 b 数组), 如

2、果判断之前已经产生过就重新产生,直到没有产生再赋值。 假设产生的随机数为 T, 有两种方法可以达到随机输出 1、在循环中产生随机数,在判断没有产生过这个随机数的情况下,把数组 aT 顺序的赋值给 b 数组 2、在循环中产生随机数,在判断没有产生过这个随机数的情况下,顺序的把数 组 a 赋值给数组 bT 总觉得这种方法效率不高,但以前也没有想出其他方法,最近想到一个方法,我 觉得这种方法效率更高,我暂且称它为“漏斗法”,简单的将思路描述如下: 定义一个与数组 an等大的数组 bn 第 1 次循环产生一个 0n-1 之间的随机数 T1, 然后将 aT1的值赋给 b1 (即 b1=aT1),然后我们

3、就将 aT1这个数“漏掉”,aT1=an-1 第 2 次循环产生一个 0n-2 之间的随机数 T2,然后将 aT2的值赋给 b2(即 b2=aT2),然后将 aT2这个元素“漏掉” ,aT2=an-2 . . 第 n-2 次循环产生一个 02 之间的随机数 Tn-2,然后将 aTn-2的值赋给 bn-2(即 bn-2=aTn-2),然后将 aTn-2这个元素“漏掉” ,aTn-2=a2 第 n-1 次,将 a 数组的第一个元素赋值给 b 的最后一个元素 文字功底不行啊。写起来比较费劲,看起来也比较费力 下面用图片来解释下这个过程,可能会更清楚 数组 a9,数组中的元素如下表 声明一个 b9(默

4、认元素值全为 0)数组作为随机输出的数组 第 1 次循环产生 09 之间的随机数,假设为 3 b0=a3; 把 a3“漏掉” a3=a9 此时数组 a 中的元素变为 b 数组 第二次循环产生 08 之间的随机数,假设为任然产生 3 b1=a3; 把 a3漏掉 a3=a8 此时数组 a 中的元素变为 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 1 2 3 4 5 6 7 8 9 10 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 1 2 3 4 5 6 7 8 9 10 b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 4 0 0 0 0 0 0 0 0

5、0 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 1 2 3 10 5 6 7 8 9 10 b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 4 0 0 0 0 0 0 0 0 0 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 1 2 3 10 5 6 7 8 9 10 b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 4 10 0 0 0 0 0 0 0 0 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 1 2 3 9 5 6 7 8 9 10 第 3 次产生 07 之间的随机数,假设为 7 b2=a7; 漏掉 a7 a7=a7

6、 此时数组 a 为 第 4 次产生 06 之间的随机数,假设为 0 b3=a0; 漏掉 a0 a0=a6 此时数组 a 为 依次类推 。 直到剩下最后一个 a1,直接将 b9=a1 就将数组进行了随机输出 上面列出了几个“特殊的位置”,起始位置、最大有效位置(比如第 1 次中的 a9,第 2 次中的 a8,第 3 次中的 a7.)、前后产生相同随机数的位置,但 是处理方法是一样的,所以也就不叫特殊位置了 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 1 2 3 9 5 6 7 8 9 10 b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 4 10 8 0 0 0 0

7、0 0 0 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 1 2 3 9 5 6 7 8 9 10 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 1 2 3 9 5 6 7 8 9 10 b0 b1 b2 b3 b4 b5 b6 b7 b8 b9 4 10 8 1 0 0 0 0 0 0 a0 a1 a2 a3 a4 a5 a6 a7 a8 a9 7 2 3 9 5 6 7 8 9 10 如果你数组 a 中的数据其他地方还需要, 可以先做一分拷贝, 用拷贝数组来 完成这个操作。 以下是 c 语言写的上述两种方法的程序(写的不精简,可以多多指点) /判断法 #incl

8、ude #define member 1000 main() int amember,bmember,cmember,i,j,k,temp,flag,num=0; /a 数组是要随机输出的源数组,b 数组装产生过的随机数方便做比较 /c 数组做输出数组 /i 做循环产生随机数,j 循环判断是否产生过这个随机数,k 计数已经产生过 的有效随机数 /flag 标记是否已经产生过这个随机数,分别做不同的处理 /num 记录产生的随机数的次数(包括无效重复的在内) for(i=0;i #define member 10 main() int i,temp,amember,bmember,num=0;

9、for(i=0;imember;i+) /产生源数组 ai=i; srand(int) time(NULL); for(i=0;imember-1;i+) /共循环 member-1 次,漏至剩最后一个 有效数组元素 a0的时候直接将值赋值给 bmember-1 num+; temp=rand()%(member-i-1); bi=atemp; atemp=amember-i-1; bmember-1=a0; for(i=0;imember;i+) printf(“b%d=%dn“,i,bi); printf(“%dn“,num); /查看共产生多少次随机数(这个数 其实是固定的,它始终比 member 小 1) 大家可以用上面的程序测试以下那个的效率高,自己写当然更高,也许更精简。 当然顺着这个思路也就可以产生随机数组了,比如你要产生一个含 10 个元 素的随机数组,数组元素在 100 以内,就可以申明 a100=0,1,299然后用 该方法循环 10 次,产生 10 个不重复的随机数组。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号