需要帮助软件并不完全符合要求

时间:2013-12-29 17:04:58

标签: c arrays

朋友您好,我需要您的帮助。

我的程序是这样的数组大小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);
}

因此,如果有人能就如何使其发挥作用给我建议,我感谢您的帮助。 感谢。

2 个答案:

答案 0 :(得分:0)

正如所建议的那样,改组可能会有效,但其他间接统计量可能会很有用,例如loop变量作为数组索引函数的分布。

这看起来很有趣,所以我继续将loop的分布绘制为数组索引的函数,这通常会随着i的增加而增加。实际上,当我们接近数组的末尾时,获得一个尚未在该集合中的新随机数的机会减少(因此,loop变量的值增加;请参阅下面的代码)。

具体来说,对于数组大小= 1000,我记录了为loop生成的非零值(大约有500个重复项),然后根据索引绘制了一个图。

情节如下:

enter image description here

下面的代码将生成一个具有唯一随机值的数组,然后计算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