编程中有时会用到的随机数。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
(本文完)