Пожалуйста помоги.Программа для генерации случайных чисел не работает - PullRequest
3 голосов
/ 24 июня 2011

Я пишу программу, которая должна генерировать N случайных неповторяющихся чисел

прототип должен быть voidrandom_int (int array [], int N);у него нет ошибок, но он не работает.Даже не давая никакого числа

#include <stdio.h>
#include <stdlib.h>
#include <time.h>


void random_init(int array[], int N)
{
   srand(time(NULL));
   int i, j;
   array[0]=rand()%N;
   for(i=1;i<N;i++)
   {
       array[i]=rand()%N;
       if(array[i]==0)
           array[i]=1;

       for(j=0;j<i;j++)
       {
           if(array[i]==array[j])
           break;
       }
       if((i-j)==1)
           continue;
       else
           i--;
   }
}

int main(void)
{
    int a[5], i, N;
    N=5;
    random_init(a,N);
    for(i=0;i<N;i++)
    printf("%d    ", a[i]);
    return 0;
}

Ответы [ 2 ]

3 голосов
/ 24 июня 2011
  1. Эта часть не имеет смысла:

    if(array[i]==0)
       array[i]=1;
    

    Это ограничит ваш выбор N-1 числами (от 1 до N-1), из которых вы пытаетесь найти N номеров без повторений, что ведет к бесконечному циклу.

  2. if((i-j)==1)
       continue;
    

    Здесь вы, вероятно, хотите вместо этого if (i==j) проверить, завершился ли предыдущий цикл до завершения.

Более быстрый и простой способ генерации чисел 0..N-1 в случайном порядке - поместить эти числа в массив (в последовательном порядке), а затем использовать Fisher-Yates Shuffle перемешать массив.

0 голосов
/ 24 июня 2011

Этот метод смещен. Не используйте его, кроме как в образовательных целях.

Кроме Фишера-Йейтса, который использует другой массив, вы можете использовать метод обхода всех доступных чисел и найти для них «случайное» место (эффективно «инициализируя» массив дважды). Если место занято, выберите следующий. Примерно так, в псевдокоде:

fill array with N
for all numbers from 0 to N-1
    find a random spot
    while spot is taken (value is N) consider next spot /* mind wrapping */
    set value in current spot

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...