C语言中的一个编程问题,编一个子函数。请大家帮忙解决。

来源:百度知道 编辑:UC知道 时间:2024/09/21 06:36:45
有一个数组a[n]={0.1,0.09,0.65,0.08....},这个数组元素的特点是:所有元素和为1.现要求重组这个数组。
重组规则是这样的:在数组的元素的值代表该元素在重组时被选中的概率。数值越大表示越有可能被选中,反之越不容易被选中。比如现在要更新第一个数组元素,那么更新的方法是在现有数组元素(包括他自己)中随机选一个替换掉第一个数组元素。但这种随机选不是每个数等概率的,而是要求各个元素被选中的可能性参照他的值,即如前所述。
我真的很需要大家帮忙,先奉献20分,答对了我再追加60分。谢谢大家!
我需要代码,谢谢!重组之后的元素和不一定要为1。
我的问题是这样的,我在编一个比较大的程序是关于无线传感器网络节点定位的算法,在这个程序中要解决一个问题,就是现在提问的。数组元素不是未知,而是在那个大程序中已经求出,这里就不写了,因为元素的数量本身是不定的,只是最终求出的结果的特点是这个数组的所有元素和为1.好,我已经把这个数组元素确定了,是什么大家不用了解,因为不重要,大家可以自己定,只要满足元素和为1,且元素不全相等即可。那么接下来要做的是把这个数组重组:重组的目的是让这个数组中的小值消失,而复制一个较大的值替换(不是交换)那个小值。至于复制哪一个,是随机的,而且值越大那么他被选中复制的概率越大,值越小被选中的概率越小。
最后的结果是这个数组中的元素值都比较大(各个值不可能大于1,和可以大于1),但是又不能刻意的把最大的值找出来复制替换所有元素,这样做没意义。重点是突出值越大被选中的概率越大。
对数组中的每一个元素都干同样的事情:准备被替换。只是轮到小值时,他被大值替换的可能性大;轮到大值时,由于他本身被选中的概率就大,所以他被小值替换掉的可能性小
谢谢大家对这个问题的关

关键是怎么来理解你的问题.
首先你的这个数组的值以及其大小本身就不够确定.尚且把这个忽略掉.你这个数组的重排规则也有点难理解.你这句"在数组的元素的值代表该元素在重组时被选中的概率。数值越大表示越有可能被选中,反之越不容易被选中。"本身说明的是数组元素的特征,而不是说明你要把这个数组排成什么样的.即使再次忽略这个问题.再看一下句,"比如现在要更新第一个数组元素,那么更新的方法是在现有数组元素(包括他自己)中随机选一个替换掉第一个数组元素。"这个倒清楚多了,你也许是想通过这种一个一个元素的更新的方式来排序,换句话说不是排序而是重新生成这个数组,而你这个生成方式也比较特别,对于第一个元素,你应该是在这个数组中最有可能选到的元素,而依照你的说法元素的值本身代表了被先中的机会,也就是说值越大越容易被选中,也就是更新的对象.那么你这个数组就演变为一种从大到小排列!但这也仅仅是从概率上讲的,实际上说这个数组根本无法确定.难道你还要用这个函数来模拟?!想来想去,主要是不大明白你要问的什么,所以也没法回答.

在研究遗传算法?你是要代码还是要思路?思路很简单,轮盘赌选择就可以。利用random()函数产生随机数0-n之间的随机数ranx,然后select=(float)ranx/n,
int i=0;
float selen=0;
while(i!=n)
{
selen+=a[i];
if(a[i]>=select)
break;
i++

}
a[i]就是轮盘赌选择选出的因子!
如果是遗传算法,你说的有点混乱了吧,要重组的不是这个数组本身,而是和这个数组元素相关联的基因元素吧。这个数组既然是按概率选择,那怎么能保证所有元素和还为1?

没能理解你的问题,不过关于每个数的概率参照他的值,你可以定义一个新数组,让a[n]中的值根据它的大小转换成次数出现在新数组中。
如你定义的数组a[n]={0.1,0.09,0.65,0.08....},你可以定义一个新数组b[100]。0.1出现10次,0.09出现9次,0.65出现65次……,
k=0;
for(i=0