Программирование на C - Массив и случайное число объединенный вопрос? - PullRequest
4 голосов
/ 21 сентября 2011

это часть моего кода, с которой у меня проблемы. Я не могу понять, почему он делает это неправильно. У меня есть массив, где он хранит числа 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 ]

2 голосов
/ 21 сентября 2011

Робста, вы можете попробовать следующий фрагмент кода, я запустил его в 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 голос
/ 21 сентября 2011

Если вы спрашиваете, как случайным образом упорядочить число 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;
}
1 голос
/ 21 сентября 2011

У вас есть эта строка кода:

check_double==1;

Это не меняет check_double, потому что это ==, а не =. == сравнивает; это не присваивает. Измените эту строку на эту:

check_double=1;

Полезный компилятор (clang в этом примере) выдаст вам предупреждение об этом:

test.c:5:14: warning: expression result unused [-Wunused-value]
        check_double==1;
        ~~~~~~~~~~~~^ ~
1 голос
/ 21 сентября 2011

Вы не можете проверить наличие дубликатов с помощью одного цикла.Вам нужно как минимум сравнить каждую возможную пару элементов, чтобы увидеть, есть ли дубликат.Я предполагаю, что вы забыли перебрать counter где-то внутри второго do...while?

Обратите внимание, что ваш метод не гарантированно завершится.(Очень, очень вероятно, но не уверен.) Почему бы вам просто не перемешать массив cases?Тасовать просто, но сложно;см. Фишер-Йейтс (или Кнут) Shuffle для простого алгоритма.

1 голос
/ 21 сентября 2011

Вы когда-либо записываете только последнее значение в массиве:

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

Вам нужно выполнить цикл как есть, а затем создать внутренний цикл, в котором вы сравниваете все остальные записи с текущей.

Еще проще было бы сделать цикл, в котором вы устанавливаете каждое случайное число, поэтому, когда вы задаете, например, case [3], выполните цикл от 0 до 2 и проверьте, если ваше новое значение для 3-х столкновений, если да, промойте - промыть - повторить!

...