本文共 1727 字,大约阅读时间需要 5 分钟。
随机算法
问题的产生:看到群里有人这样提问~ * 每次随即产生出1-100数字序列,每次产生都不一样* 而且1-100的数字序列里面不可以有一样的数字。 我就有个写这个算法的想法,同时也把它实现在.
我的理解:我是这样理解的.就是给定一个数字序列于你,编程实现输出乱序的序列.如给定序列1~10,随机输出的一个结果可能是,1 5 6 7 3 2 10 8 9 4的一个序列.(同时这个序列也是下面我编程所演示用的)
我的大概思想(算法):因为与随机有关,当然会用到random函数.但并不是算法的主要讨论问题.进入正题.每一次循环都要比前一次循环产生少一个随机数,同时用于存放数字序列的数据结构也要相应的少一个数字元素(意思是不断减少随机数产生的范围,同时也减少序列元素的个数).这名话是我的算法的中心.
算法细节的解决方案:随机数产生的范围用random函数与数字表达式构成!主要与语言的random函数性质有关.用别的语言可做相应的改变,可以参照我的例子(改进我的例子会更好!)数字序列的减少就控制数字序列的数据结构的元数个数的减小,也就是说那个元素被取出数字序列,就把它从数字序列中删去.
算法的一个实现例子~~(用JAVA语言写的)
public class RandomSerial{ public static void main(String args[]) { int[] data ={0,0,0,0,0,0,0,0,0,0,0};/*存放随机得到的数字序列*/ int[] temp ={0,0,0,0,0,0,0,0,0,0,0};/*存放序列的初使情况*/ int a = 0; for(int i= 1; i <= 10; i++)//初使化所要输出序列的数组 { temp[i]=i; } for(int j = 1; j <= 10; j++) { a = (int)(Math.random()*(10-j)+1+0.5); /*~~~~~~0.0 <= random()*(10-j) < (10-j)~~~~~~~*/ /*~~~~~~0 <= (int)(Math.random()*(10-j)+1+0.5) <= (10-j)~~~~~~*/ data[j] = temp[a]; for(int k = a ; k <= 10 - j; k++) { temp[k] = temp[k+1];/*为了把已取到的序列中的数从序列数组中去掉, 向前移到元素缩短数组*/ } for(int x =1; x <= 10-j; x++) System.out.print(temp[x] + " "); System.out.println("******");/*输出当前序列中的序列数组的情况*/ }/*每次循环随机取一个数,并缩小产生随机数的个数与序列数组的长度 随机数个数与序列数组的个数是同步的*/ System.out.println("~~~~~~~~~~~~~~~"); for(int i = 1; i <= 10 ; i++) { System.out.print(data[i] + " "); }/*输出得到的随机序列*/ System.out.println(); } } *程序中加入一些与算法无关的语气是为容易看程序的运行结果
讨论:由于我以前没看过有关这方面的算法讲解,我所想出来的是我所学过的编程知识运用。讨论的一点是我觉得用于存放数据序列的数据结构根据具体情况用所改变。我所用的是数组,因为我的序列元素个数很少,虽然对序列元素的删除我所采用的是元素往前移的算法,但个数小的情况下并不多大的关系。但如果序列元素个数很多,基于链表的删除效率远远比顺序表的效率高得多,此时用一个链表存放数字序列是比较好的选择。
后话:希望对这个算法感兴趣或做过类似这样的算法朋友得与我讨论。发现我范什么错误的请多多给我指证。也想多交些朋友一同学习与进步~
转载地址:http://lumbi.baihongyu.com/