#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;
}