朋友您好,我需要您的帮助。
我的程序是这样的数组大小1000,其中数字应该在0-999之间。这些数字应该随机确定(兰特循环),不得重复这个数字。将被视为主要部分,我必须计算我使用rand()的次数。
我的想法是:一个循环,它初始化所有1000个数字,如果在这个循环中,他们检查数字是否出现两次,如果数字出现两次再次设置,直到没有出现两次(也许这不是最好的方式,但......)
这是我的练习(我需要你的帮助) -
#include <stdio.h>
#include <stdlib.h>
int main()
{
int const arr_size = 1000;
int i, j, c;
int arr[arr_size];
int loop = 0;
for(i = 0; i<arr_size; i++)
{
arr[i] = rand() % 1000;
loop++;
if (arr[i] == arr[i - 1])
{
arr[i] = rand() % 1000;
loop++;
}
}
printf("%d\n",loop);
}
因此,如果有人能就如何使其发挥作用给我建议,我感谢您的帮助。 感谢。
答案 0 :(得分:0)
正如所建议的那样,改组可能会有效,但其他间接统计量可能会很有用,例如loop
变量作为数组索引函数的分布。
这看起来很有趣,所以我继续将loop
的分布绘制为数组索引的函数,这通常会随着i的增加而增加。实际上,当我们接近数组的末尾时,获得一个尚未在该集合中的新随机数的机会减少(因此,loop
变量的值增加;请参阅下面的代码)。
具体来说,对于数组大小= 1000,我记录了为loop
生成的非零值(大约有500个重复项),然后根据索引绘制了一个图。
情节如下:
下面的代码将生成一个具有唯一随机值的数组,然后计算loop
的值。循环值可以存储在另一个数组中,然后保存以供以后分析,但我没有在下面的代码中包含它。
同样,我并不完全确定这适合应用程序,但它确实会返回使用shuffle算法的方法无法获得的信息。
注意:有些人表示担心这可能需要多长时间,但它运行得非常快,在我的2011款Macbook Pro上花了大约一秒钟,数组大小为1000.我没有做一个大O分析作为数组大小的函数,但这也很有趣。
注意2 :对于numberInSet()函数使用递归更优雅,但最好保持简单。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdbool.h> /* If C99 */
const int ARR_SIZE = 1000;
/* Check if the number is in the set up to the given position: */
bool numberInSet(int number, int* theSet, int position);
int main()
{
int* arr = malloc(sizeof(int)*ARR_SIZE);
srand((unsigned int)time(NULL));
/* Intialize array with rand entries, possibly duplicates: */
for(int i = 0; i < ARR_SIZE; i++)
arr[i] = rand() % ARR_SIZE;
/* Scan the array, look for duplicate values, replace if needed: */
for(int i = 0; i < ARR_SIZE; i++) {
int loop = 0;
while ( numberInSet(arr[i], arr, i-1) ) {
arr[i] = rand() % ARR_SIZE;
loop++;
}
/* could save the loop values here, e.g., loopVals[i] = loop; */
}
for(int i = 0; i < ARR_SIZE; i++)
printf("i = %d, %d\n",i,arr[i]);
/* Free the heap memory */
free(arr);
}
bool numberInSet(int number, int* theSet, int position) {
if (position < 0)
return false;
for(int i = 0; i <= position; i++)
if (number == theSet[i])
return true;
return false;
}
答案 1 :(得分:-1)
为了确保您在同一个程序中获得的所有随机数不同,您必须种子随机生成器:
srand (time(NULL)); //seed the random generator
//in the loop, rand will use the seeded value
rand() % 1000