已知平均值怎么生成随机数,正态分布和死循环都已经想到了 但效果都不大理想,有没有其他的思路
这里有个东西很矛盾,你是否知道到底要生成几个数,如果知道,那么就通过 area = average * n; 然后通过再在area的基础上生成,但是如果不知道的话就无法保证 平均数一定是他了。就要记录下每次生成的随机数,然后大致调整下一个随机数的生成,让 area -> average * n 。
或者通过平衡法来生成,程序如下
#include <stdio.h>
#include <stdlib.h>
#include<time.h>
void randEvar( int * list , int n , int evarage );
void printList(int * list , int n);
int main(){
int list[100];
randEvar(list,5,76);
printList(list,5);
}
void randEvar( int * list , int n , int evarage ){
srand((int)time(NULL));
// 初始化列表 均为平均值
for( int i = 0 ; i < n ; i++ ){
list[i] = evarage;
}
// 迭代次数
int flag = rand();
// 为保证迭代次数足够 迭代次数需要大于 (n*evarage)
while( flag < n * evarage ){
flag = rand();
}
for( int i = 0 ; i < flag ; i++ ){
// 抽取两个数进行 数量 转移
int a = rand() % n;
int b = rand() % n;
list[a] ++;
list[b] --;
}
}
void printList(int * list , int n){
for( n = n-1 ;n>=0;n-- ){
printf("%d ",list[n]);
}
}
生成效果如下