目录
C
randomArray
int* randomArray(int length, int maxValue) {
srand(time(NULL));
int* arr = (int*)malloc(length * sizeof(int));
for (int i = 0; i < length; i++) {
arr[i] = rand() % maxValue + 1;
}
return arr;
}
copyArray
int* copyArray(int arr[], int length) {
int* copy = (int*)malloc(length * sizeof(int));
if (copy == NULL) {
// 内存分配失败
return NULL;
}
for (int i = 0; i < length; i++) {
copy[i] = arr[i];
}
return copy;
}
Java
randomArray
public static int[] randomArray(int n, int v) {
int[] arr = new int[n];
for (int i = 0; i < n; i++) {
arr[i] = (int) (Math.random() * v) + 1;
}
return arr;
}
copyArray
public static int[] copyArray(int[] arr) {
int n = arr.length;
int[] copy = new int[n];
for (int i = 0; i < n; i++) {
copy[i] = arr[i];
}
return copy;
}
涉及到的基础知识
C语言中的 rand() 函数
rand()
函数的使用规则
-
包含头文件: 首先需要包含
<stdlib.h>
头文件,因为 rand() 函数被声明在这个头文件中 -
初始化随机数种子: 在使用 rand() 函数之前,通常需要调用
srand()
函数来初始化随机数生成器的种子。如果不初始化种子,每次程序运行时都会生成相同的随机数序列。通常使用当前时间作为种子,因为时间在每次运行时都会不同;srand(time(NULL));
这里time(NULL)
返回当前时间的秒数,可以确保每次运行程序时都会有不同的种子 -
返回值:调用 rand() 函数来生成伪随机数。rand() 函数会返回一个在
[0,RAND_MAX)
范围内的整数
,RAND_MAX
是一个宏,表示在给定平台上 rand() 函数能够生成的最大随机数值。一般情况下,RAND_MAX
的值至少是 32767 -
控制生成范围: 如果你需要生成一定范围内的随机数,可以使用取模运算符来实现
int randomNumberInRange = rand() % (maxValue - minValue + 1) + minValue; //可以生成在 [minValue, maxValue] 范围内的随机整数 //不要使用 (rand() / RAND_MAX) * k 的方式来获取 [0, k] 范围内的整数 //因为由于整数除法的特性,这个表达式大部分情况下会得到 0,除非 rand() 返回的值刚好是 RAND_MAX //eg. int num1 = rand() % k; //生成[0,k)之间的整数 int num2 = rand() % (k + 1); //生成[0,k]之间的整数 //生成[0,1]之间的浮点数 double num3 = (double)rand() / RAND_MAX; //生成[0,k]之间的浮点数 double num4 = ((double)rand() / RAND_MAX) * k;
Java中的 Math.random() 函数
-
语法:
double randomValue = Math.random();
-
返回值:
Math.random()
函数返回一个在 [0,1) 范围内的伪随机双精度浮点数 -
控制生成范围:如果你需要生成一定范围内的随机数,可以使用乘法运算符来实现
int randomNumber = (int)(Math.random() * (max - min + 1) + min); //可以生成在 [minValue, maxValue] 范围内的随机整数 //eg. int num1 = (int)(Math.random() * k); //生成[0,k)之间的整数 int num2 = (int)(Math.random() * (k + 1); //生成[0,k]之间的整数 //生成[0,k)之间的浮点数 double num4 = (Math.random() * k;
C和Java函数返回类型以及传递的参数的区别
函数返回类型区别
在Java中函数可以直接返回数组,可以在函数中创建一个数组,填充它,并直接返回它。这是因为Java中的数组是对象,函数可以返回对象引用
在C语言中函数不能直接返回数组,C语言不支持将数组作为函数的返回值,因为C语言不允许返回数组的地址。如果需要返回一个数组,通常的做法是通过传递数组的指针作为参数,并在函数内部修改这个数组,而不是直接返回数组
传递的参数的区别
在Java中,数组是对象,而对象引用传递的是对象的地址。当您将一个数组作为参数传递给函数时,实际上传递的是数组的引用,这个引用指向数组在内存中的位置。因为传递的是数组的引用,所以在函数内部可以通过这个引用访问数组的属性,比如 length
属性,来获取数组的长度
在 C 语言中,数组作为函数参数传递时会被隐式转换为指向数组首元素的指针。因此,int* copyArray(int arr[])
中的 arr
其实是一个指向整数的指针,而不是数组本身。在函数中使用 sizeof(arr)
来获取数组的长度是不正确的。因为在函数中,arr
只是一个指针,sizeof(arr)
实际上会返回指针的大小,而不是整个数组的大小。在 C 语言中,没有办法直接获取传递给函数的数组的长度
C语言中的 malloc() 函数
malloc()
的使用规则 在C语言中,malloc()
函数用于动态分配内存
//eg.
int *ptr;
ptr = (int *)malloc(10 * sizeof(int));
//分配了足够的内存空间来存储10个整数,并将指向该内存空间的指针赋值给了 ptr
/*(int*) 将 malloc() 返回的 void* 类型的指针转换为 int* 类型的指针
具体来说,malloc() 函数返回的是 void* 类型的指针,
因为它不知道要分配的内存空间是什么类型的数据。
而在实际使用中,我们通常需要将分配的内存空间视为某种特定类型的数据,
比如 int 类型的数组
*/
- 包含头文件:在使用
malloc()
函数之前,需要包含<stdlib.h>
头文件 - 分配内存:
malloc()
函数的原型为:void *malloc(size_t size);
它接受一个参数,即要分配的内存空间的字节数。返回一个指向分配内存空间起始地址的指针,或者在分配失败时返回 NULL。分配的内存大小应该是正整数