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

有一个数组a[n]={0.1,0.09,0.65,0.08....},这个数组元素的特点是:所有元素和为1.现要求重组这个数组。重组规则是这样的:在数组的元素的值代表该元... 有一个数组a[n]={0.1,0.09,0.65,0.08....},这个数组元素的特点是:所有元素和为1.现要求重组这个数组。
重组规则是这样的:在数组的元素的值代表该元素在重组时被选中的概率。数值越大表示越有可能被选中,反之越不容易被选中。比如现在要更新第一个数组元素,那么更新的方法是在现有数组元素(包括他自己)中随机选一个替换掉第一个数组元素。但这种随机选不是每个数等概率的,而是要求各个元素被选中的可能性参照他的值,即如前所述。
我真的很需要大家帮忙,先奉献20分,答对了我再追加60分。谢谢大家!
我需要代码,谢谢!重组之后的元素和不一定要为1。
我的问题是这样的,我在编一个比较大的程序是关于无线传感器网络节点定位的算法,在这个程序中要解决一个问题,就是现在提问的。数组元素不是未知,而是在那个大程序中已经求出,这里就不写了,因为元素的数量本身是不定的,只是最终求出的结果的特点是这个数组的所有元素和为1.好,我已经把这个数组元素确定了,是什么大家不用了解,因为不重要,大家可以自己定,只要满足元素和为1,且元素不全相等即可。那么接下来要做的是把这个数组重组:重组的目的是让这个数组中的小值消失,而复制一个较大的值替换(不是交换)那个小值。至于复制哪一个,是随机的,而且值越大那么他被选中复制的概率越大,值越小被选中的概率越小。
最后的结果是这个数组中的元素值都比较大(各个值不可能大于1,和可以大于1),但是又不能刻意的把最大的值找出来复制替换所有元素,这样做没意义。重点是突出值越大被选中的概率越大。
对数组中的每一个元素都干同样的事情:准备被替换。只是轮到小值时,他被大值替换的可能性大;轮到大值时,由于他本身被选中的概率就大,所以他被小值替换掉的可能性小
谢谢大家对这个问题的关
展开
 我来答
main_inf
2008-09-11 · TA获得超过1575个赞
知道小有建树答主
回答量:811
采纳率:100%
帮助的人:529万
展开全部
关键是怎么来理解你的问题.
首先你的这个数组的值以及其大小本身就不够确定.尚且把这个忽略掉.你这个数组的重排规则也有点难理解.你这句"在数组的元素的值代表该元素在重组时被选中的概率。数值越大表示越有可能被选中,反之越不容易被选中。"本身说明的是数组元素的特征,而不是说明你要把这个数组排成什么样的.即使再次忽略这个问题.再看一下句,"比如现在要更新第一个数组元素,那么更新的方法是在现有数组元素(包括他自己)中随机选一个替换掉第一个数组元素。"这个倒清楚多了,你也许是想通过这种一个一个元素的更新的方式来排序,换句话说不是排序而是重新生成这个数组,而你这个生成方式也比较特别,对于第一个元素,你应该是在这个数组中最有可能选到的元素,而依照你的说法元素的值本身代表了被先中的机会,也就是说值越大越容易被选中,也就是更新的对象.那么你这个数组就演变为一种从大到小排列!但这也仅仅是从概率上讲的,实际上说这个数组根本无法确定.难道你还要用这个函数来模拟?!想来想去,主要是不大明白你要问的什么,所以也没法回答.
何处淬吴钩
2008-09-11 · TA获得超过5043个赞
知道大有可为答主
回答量:2947
采纳率:50%
帮助的人:2377万
展开全部
在研究遗传算法?你是要代码还是要思路?思路很简单,轮盘赌选择就可以。利用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?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
魔方宫殿
2008-09-11 · TA获得超过287个赞
知道小有建树答主
回答量:103
采纳率:0%
帮助的人:68万
展开全部
没能理解你的问题,不过关于每个数的概率参照他的值,你可以定义一个新数组,让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;i<n;i++)
for(j=0;j<a[i]*100;j++)
b[k++]=a[i];
这样再t=random(99),b[t]所选中的值的概率就是参照他的值啦!
继续写:
for(i=0;i<n;i++)
a[i]=b[t];
这样就已经重组了。多循环几次,小值就可能消失了。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
karl_shurt
2008-09-11 · TA获得超过158个赞
知道答主
回答量:133
采纳率:0%
帮助的人:85.7万
展开全部
设数组a的元素个数为size
double b[size+1];
for(int i=0; i<=size; i++)
{
b[i] = 0.0;
}
for(int ii=1; ii<=size; ii++)
{
b[ii] += a[ii]*100;
}

srand(time(0));
for(int j=0; j<size; j++)
{
int key = rand()%100;
for(int k=1; k<=size; k++)
{
if(b[k-1]<key && key<b[k])
{
int temp = a[j];
a[j] = a[k-1];
a[k-1] = temp;
}
else{}
}
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(2)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式