编程新手求助:如何生成4个0-1区间的不同随机数?
解决生成不同0-1随机数的问题
嘿,作为编程新手遇到这个问题太正常了,我来一步步帮你搞定!
首先,你的代码里随机数全相同的核心原因有两个:
- 没有初始化随机数种子,
rand()函数默认会用固定种子,导致每次生成的随机序列完全一样; - 你用了
int类型变量,但0到1之间的整数只有0和1,根本没法生成4个不同的数——得用浮点数类型(比如double)才能存储0到1之间的小数。
修正后的完整代码
#include <stdio.h> #include <stdlib.h> #include <time.h> #include <math.h> // 用于毕达哥拉斯定理的sqrt和pow函数 int main() { // 改用double类型存储0-1之间的随机小数 double x1, x2, y1, y2; double distance, average; // 初始化随机数种子:用当前时间作为种子,确保每次运行生成不同序列 srand(time(NULL)); // 生成第一个随机数 x1 = (double)rand() / RAND_MAX; // 生成x2,确保和x1不同 do { x2 = (double)rand() / RAND_MAX; } while (x2 == x1); // 生成y1,确保和x1、x2都不同 do { y1 = (double)rand() / RAND_MAX; } while (y1 == x1 || y1 == x2); // 生成y2,确保和前三个都不同 do { y2 = (double)rand() / RAND_MAX; } while (y2 == x1 || y2 == x2 || y2 == y1); // 毕达哥拉斯定理计算:比如两点(x1,y1)和(x2,y2)的距离 distance = sqrt(pow(x2 - x1, 2) + pow(y2 - y1, 2)); // 求取四个随机数的平均值 average = (x1 + x2 + y1 + y2) / 4.0; // 输出结果 printf("四个不同的随机数:%.6f, %.6f, %.6f, %.6f\n", x1, x2, y1, y2); printf("两点间距离(毕达哥拉斯定理):%.6f\n", distance); printf("随机数的平均值:%.6f\n", average); return 0; }
关键知识点解释
- 随机数种子初始化:
srand(time(NULL))会把当前系统时间作为随机数生成器的种子,因为时间每秒都在变化,所以每次运行程序都会得到不同的随机序列。 - 生成0-1之间的浮点数:
(double)rand() / RAND_MAX是标准写法——rand()生成0到RAND_MAX(通常是32767)之间的整数,转换成double后除以最大值,就得到了0.0到1.0之间的随机小数。 - 去重逻辑:用
do-while循环,每次生成新数后检查是否和已有的数重复,重复就重新生成,直到得到不同的数为止。 - 毕达哥拉斯计算:用
sqrt(pow(delta_x, 2) + pow(delta_y, 2))计算两点间的直线距离,需要包含math.h头文件,编译的时候记得加上-lm参数(比如gcc your_code.c -o program -lm)。
内容的提问来源于stack exchange,提问作者Victor Pasini Bilbao
相关产品推荐
相关产品推荐

