生成加和一定的随机序列

编程中有时会用到的随机数。C语言中主要通过rand()函数来生成随机数。现在我们的问题要更复杂一些,假设有ROW组随机数序列,其中每组序列都由COL个随机数构成,同时还要求每组中的COL个随机数之和为一个定值。例如,我们假设每个随机数是大于等于0并小于1的一个小数(保留小数点后两位有效数字)。在解决这个问题时会重点考察你对C语言中随机数生成方法的理解,同时一些细节上的处理技巧也非常值得关注。

下面这段示例代码演示了上述功能的实现方法(在实现中我们还引入了另外一个特殊的要求,即保证每个随机序列中最后一个随机数是其所在组中的最大值):

#include<stdio.h>
#include<stdlib.h>
#include<time.h>

#define SUM 100
#define ROW 100
#define COL 5

int main(){

    srand((unsigned) time(NULL)); //用时间做种,每次产生随机数不一样
    
    unsigned int * sequence = malloc(COL * sizeof(unsigned int));
    
    double ** matrix;
    matrix = malloc(ROW * sizeof(double*));
    
    for(int j = 0; j < ROW; j++){
        
        unsigned int addup = 0;
        unsigned int range = 100;
    
        for(int i = 0; i < COL-1; i++){
            
            sequence[i] = rand()%range; //产生0-100的随机数
            range -= sequence[i];
            addup += sequence[i];
        }
        
        sequence[COL-1] = SUM - addup;
        
        matrix[j] = (double*) malloc (sizeof(double) * COL);
        
        for(int i = 0; i < COL; i++){
            matrix[j][i] = ((double)sequence[i])/SUM;
            //printf("%.2f ",matrix[j][i]);
        }
        //printf("n");
        
        double tmp = 0.0;
        for (int i = 0; i < COL-1; i++) {
            if(matrix[j][i] 大专栏  生成加和一定的随机序列pan class="o">> matrix[j][i+1]){
                tmp = matrix[j][i];
                matrix[j][i] = matrix[j][i+1];
                matrix[j][i+1] = tmp;
            }
        }
    }

    
    for(int j = 0; j < ROW; j++){
        for(int i = 0; i < COL; i++)
            printf("%.2f ",matrix[j][i]);
        printf("n");
    }
    
    free(sequence);
    sequence = NULL;
    
    for (int i = 0; i < ROW; i++)
    {
        free(*(matrix + i));
        matrix[i] = NULL;
    }
    
    free(matrix);
    matrix = NULL;
    
    return 0;
}

执行上述代码可得输出结果如下,可见我们的方法执行得相当不错!

0.04 0.03 0.03 0.01 0.89 
0.00 0.00 0.00 0.01 0.99 
0.06 0.19 0.01 0.15 0.59 
0.22 0.05 0.16 0.01 0.56 
0.39 0.11 0.05 0.05 0.40 
0.06 0.44 0.00 0.03 0.47 
0.00 0.09 0.00 0.02 0.89 
0.22 0.07 0.24 0.01 0.46 
0.13 0.18 0.01 0.07 0.61 
0.36 0.02 0.18 0.08 0.36 
0.17 0.03 0.11 0.01 0.68 
0.47 0.00 0.00 0.06 0.47 
0.14 0.22 0.03 0.04 0.57 
0.45 0.05 0.01 0.01 0.48 
0.09 0.06 0.01 0.08 0.76 
0.35 0.05 0.01 0.01 0.58 
0.00 0.16 0.15 0.01 0.68 
0.03 0.00 0.02 0.01 0.94 
0.11 0.00 0.02 0.07 0.80 
0.34 0.16 0.02 0.01 0.47 
0.29 0.24 0.05 0.01 0.41 
0.07 0.06 0.04 0.02 0.81 
0.12 0.18 0.16 0.02 0.52 
0.04 0.08 0.23 0.02 0.63 
0.13 0.17 0.00 0.02 0.68 
0.05 0.02 0.03 0.01 0.89 
0.23 0.22 0.07 0.01 0.47 
0.22 0.07 0.01 0.07 0.63 
0.10 0.03 0.03 0.01 0.83 
0.08 0.14 0.09 0.29 0.40 
0.17 0.05 0.05 0.08 0.65 
0.36 0.09 0.07 0.03 0.45 
0.03 0.02 0.00 0.02 0.93 
0.01 0.03 0.11 0.07 0.78 
0.19 0.00 0.32 0.01 0.48 
0.35 0.12 0.14 0.02 0.37 
0.06 0.00 0.00 0.01 0.93 
0.09 0.09 0.00 0.01 0.81 
0.41 0.07 0.04 0.01 0.47 
0.05 0.07 0.16 0.06 0.66 
0.44 0.01 0.00 0.02 0.53 
0.29 0.03 0.00 0.01 0.67 
0.15 0.00 0.19 0.24 0.42 
0.15 0.31 0.05 0.01 0.48 
0.07 0.04 0.03 0.02 0.84 
0.00 0.25 0.01 0.07 0.67 
0.32 0.06 0.00 0.04 0.58 
0.05 0.03 0.06 0.08 0.78 
0.12 0.16 0.05 0.30 0.37 
0.06 0.05 0.00 0.05 0.84 
0.09 0.15 0.11 0.02 0.63 
0.16 0.00 0.06 0.02 0.76 
0.17 0.01 0.02 0.01 0.79 
0.08 0.09 0.02 0.01 0.80 
0.19 0.13 0.00 0.01 0.67 
0.10 0.00 0.00 0.01 0.89 
0.10 0.23 0.08 0.06 0.53 
0.32 0.00 0.01 0.02 0.65 
0.04 0.27 0.05 0.03 0.61 
0.30 0.18 0.00 0.01 0.51 
0.33 0.07 0.07 0.15 0.38 
0.06 0.06 0.09 0.08 0.71 
0.00 0.03 0.44 0.07 0.46 
0.35 0.14 0.01 0.01 0.49 
0.05 0.01 0.01 0.03 0.90 
0.25 0.15 0.06 0.04 0.50 
0.01 0.01 0.00 0.02 0.96 
0.05 0.10 0.00 0.02 0.83 
0.08 0.09 0.06 0.10 0.67 
0.07 0.03 0.02 0.02 0.86 
0.19 0.24 0.00 0.01 0.56 
0.31 0.00 0.04 0.02 0.63 
0.18 0.13 0.00 0.01 0.68 
0.14 0.10 0.22 0.19 0.35 
0.28 0.18 0.03 0.05 0.46 
0.08 0.00 0.34 0.12 0.46 
0.31 0.01 0.00 0.01 0.67 
0.32 0.14 0.01 0.01 0.52 
0.22 0.00 0.00 0.02 0.76 
0.28 0.15 0.07 0.15 0.35 
0.29 0.18 0.09 0.07 0.37 
0.14 0.14 0.18 0.22 0.32 
0.05 0.12 0.02 0.02 0.79 
0.18 0.04 0.00 0.01 0.77 
0.10 0.33 0.04 0.04 0.49 
0.04 0.12 0.05 0.26 0.53 
0.11 0.10 0.25 0.08 0.46 
0.41 0.00 0.01 0.04 0.54 
0.02 0.08 0.18 0.06 0.66 
0.05 0.26 0.07 0.11 0.51 
0.21 0.01 0.02 0.36 0.40 
0.24 0.13 0.06 0.19 0.38 
0.21 0.02 0.00 0.01 0.76 
0.04 0.06 0.00 0.01 0.89 
0.22 0.13 0.02 0.19 0.44 
0.01 0.32 0.08 0.20 0.39 
0.11 0.04 0.05 0.15 0.65 
0.14 0.01 0.03 0.01 0.81 
0.25 0.29 0.08 0.06 0.32 
0.28 0.04 0.03 0.09 0.56

(本文完)

猜你喜欢

转载自www.cnblogs.com/liuzhongrong/p/12365573.html