C编程 - 一个数组和一个随机数组合问题?

时间:2011-09-21 05:12:05

标签: c arrays random

这是我的代码的一部分,我遇到了麻烦。我无法理解为什么它做错了。我有一个数组,它存储数字0 - 25,这是案件。这些数字将被随机化并覆盖到数组中。唯一的条件是没有数字可以是doulbes,只能有一个这个数字。我不是要求你做我的代码,而是暗示我或指出我的写作方向。我正在努力学习:)

问题在于第二个do循环。我可以把数字随机化,但我得到双打。我创建了一个循环来检查和修复它,但它不起作用。代码确实运行,双打仍然发生,我不明白为什么。它对我来说是正确的。请看,谢谢(:

这就是我最初所做的事情(最后是我现在所处的位置):

int check_double = 0;
int i = 0;
int counter = 0;
int array_adder = 0;
int random_number = 0;

int cases[] = {
    1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26
    };

float money[] = {
    0.01,1,5,10,25,50,75,100,200,300,400,500,750,1000,5000,10000,25000,50000,750000,100000,200000,300000,400000,500000,750000,1000000
    };

//Randomize all case number and realine them in the array
srand ( time(NULL) );
do
{
    cases[counter]= rand() % 26;
    counter += 1;
    printf("%d\n", cases[counter]);
}
while (counter <= 25);

//make sure there are no doubles in the array, just 0 - 25 and not a single number repeated twice
do
{
    check_double = 0;

    for (i = 0; i < counter; i++)
    {
        if (cases[counter] == cases[i])
        {
            cases[counter] = rand()% 26;
            check_double == 1;
        }
    }
}

while (check_double != 0);

目前,我之后所做的就是梳理两个循环并检查阵列的双打。这就是我所做的,它仍然有双打,我不知道为什么,我只发布了两个循环组合的cose:

do
{

cases[counter]= rand() % 26;

if (cases[counter]>=1);

    for(i=0;i<=counter;i++)

    if (cases[counter]==cases[i])
        {
            cases[counter]=rand()% 26;
        }

printf("%d\n",cases[counter]);
counter+=1;
}

5 个答案:

答案 0 :(得分:2)

Robsta,您可以尝试下面这段代码,我已经在Dev-C ++中运行了这些代码,您需要的所有更改都可以在您身边进行。但是,我向你保证,这段代码会产生你想要的东西。

int check_double = 0;
int i = 0;
int counter = 0;

int cases[] = {
    1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26
    };
//Randomize all case number and realine them in the array
srand ( time(NULL) );
do
{

cases[counter]= rand() % 26;

   for(i=0;i<counter;i++)
    if (cases[counter]==cases[i]){
      while (cases[counter]==cases[i])
        {
            cases[counter]=rand()% 26;
        }
      i=0;
    }

printf("%d\t%d\n",counter,cases[counter]);
counter+=1;
}while (counter <= 25);

如果您需要任何澄清,我很乐意与您讨论。

-Sandip

答案 1 :(得分:1)

你只是写过数组中的最后一个值:

for(i=0;i<counter;i++)
    if (cases[counter]==cases[i])

你需要像现在一样循环,然后有一个内部循环,在那里你将所有其他条目与当前条目进行比较。

更容易做到设置每个随机数的循环,所以当您设置案例[3]时,循环从0到2并检查您的新值是否为3冲突,如果是,请清洗 - 冲洗 - 重复!

答案 2 :(得分:1)

你有这行代码:

check_double==1;

这不会改变check_double,因为它是==,而不是===比较;它不分配。将该行更改为:

check_double=1;

一个有用的编译器(本例中为clang)会给你一个警告:

test.c:5:14: warning: expression result unused [-Wunused-value]
        check_double==1;
        ~~~~~~~~~~~~^ ~

答案 3 :(得分:1)

您无法通过单个循环检查重复项。您需要至少比较每个可能的元素对,以便能够查看是否存在重复。我猜你忘了在第二个counter内的某个地方转过do...while吗?

请注意,您的方法无法保证终止。 (非常,非常可能但不确定。)为什么不简单地将cases数组洗牌?洗牌很简单但很棘手;有关简单算法,请参阅Fisher-Yates (or Knuth) Shuffle

答案 4 :(得分:1)

如果你问如何随机排序数字1-25那么你可以做这样的事情。这是一种非常强力的生成序列的方法,但它确实有效,并且可能为您提供更优化的起点。

#include "stdafx.h"
#include <stdlib.h>
#include <time.h>
#include <conio.h>

const int LastNumber = 25;

bool HasEmpty(int available[LastNumber][2])
{
    bool result = false;
    for(int i = 0; i < LastNumber; i++)
    {
        if (available[i][1] == 0)
        {
            result = true;
            break;
        }
    }

    return result;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int available[LastNumber][2];
    int newSequence[LastNumber];

    srand((unsigned int)time(NULL));

    for(int i = 0; i < LastNumber; i++)
    {
        available[i][0]=i;
        available[i][1]=0;
    }

    int usedIndex = 0;

    while (HasEmpty(available))
    {
         int temp = rand() % (LastNumber + 1);
         if (available[temp][1] == 0)
         {
             newSequence[usedIndex++] = available[temp][0];
             available[temp][1] = 1;
         }
    }   

    for(int i = 0; i < LastNumber; i++)
    {
        printf("%d\n",newSequence[i]);
    }

    getch();

    return 0;
}