Проблемы при выделении массива из 6 уникальных случайных чисел

#arrays #c #algorithm #malloc

Вопрос:

Поэтому я хочу сгенерировать массив случайных чисел от 1 до 6 (уникальных) с вероятностью 60% появления 0 (неуникальных). Вот что я сделал.

 #define SIZE 6
int *t_size(){
    int i, j;
    int *tab; 
    tab = (int*)malloc(sizeof(int) * SIZE);
    int randnum;
    bool chance = rand() <= 0.6;

    for(i = 0; i < SIZE; i  ){
        randnum = rand() % (SIZE  1);
        printf("%d n",randnum);
        if(randnum == 0){
            if (chance){
                tab[i] = randnum;
                continue;
            }
        }
        else{
            for(j = 0; j < i; j  ){
                    if(randnum == tab[j])
                        break;
            }
            if (i == j){ 
                tab[i] = randnum;
                printf("tab [%d] val %d n",i, tab[i]);
            }
            else 
                i--;
        }
    }
    return tab;
 

Вот мой вывод

 1 
tab [0] val 1
6
tab [1] val 6
5
tab [2] val 5
3
tab [3] val 3 
2
tab [4] val 2
5
0
1 6 5 3 2 691419256
 

По какой-то причине на 5-м элементе он перестал работать и вместо этого показал кучу случайных чисел(которые, я думаю, являются адресами ?) Поэтому я думаю, что проблема возникла из-за моего распределения с malloc, но я не знаю, как это исправить. Также было бы неплохо любое предложение/совет с алгоритмом.

P/s: для справки, РАЗМЕР определяется 6

Комментарии:

1. Помните, что rand возвращает целое число между 0 и RAND_MAX . Это означает rand() <= 0.6 , что будет верно только в том случае, если rand() вернется 0 , что с очень низкой вероятностью.. Кроме того, rand() <= 0.6 будет выполнено только один раз.

2. о да, сейчас я просто вижу кучу ошибок, большое спасибо!!

3. Я поставил это в начале, так как это всего лишь функция в моем проекте, но вы правы, я должен поставить это и тогда, когда задаю вопросы. Это мой первый раз, когда я использую stackoverflow, спасибо!

Ответ №1:

Вот алгоритм:

  • Заполните массив цифрами 1-6 в порядке;
  • Выполните итерацию по массиву и на каждом индексе нарисуйте случайное число, чтобы решить, сохранить ли это число или заменить его на 0, с вероятностью 60%;
  • Выполните перетасовку Фишера-Йейтса в массиве.
 #include <stdlib.h>

void shuffle(int *array, unsigned int size)
{
    unsigned int i;
    unsigned int j;
    int tmp;
    for (i = 0; i < size;   i)
    {
        j = i   (unsigned int) ((double) rand() / RAND_MAX) * (size - i);
        tmp = array[i];
        array[i] = array[j];
        array[j] = tmp;
    }
}

int *random_array(unsigned int size, double nonzero_chance)
{
    int *array = malloc(sizeof(int) * size);
    unsigned int i;

    for (i = 0; i < size;   i)
    {
        if ((double) rand() < nonzero_chance * RAND_MAX)
        {
            array[i] = i 1;
        }
        else
        {
            array[i] = 0;
        }
    }
    shuffle(array);
    return array;
}