加和一定的随机序列生成方法

来源:互联网 发布:普通网络作家收入 编辑:程序博客网 时间:2024/05/17 23:21

编程中有时会用到的随机数。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 5int 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] > 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


(本文完)

4 0