Для генерации массива случайных чисел в заданном диапазоне в «C» - PullRequest
1 голос
/ 13 ноября 2010

Я хочу сгенерировать массив случайных чисел, например, если диапазон равен [0,10], тогда желаемым выходом будет 2 3 5 6 4 7 8 9 0 1 (без повторов)

theПроблема, с которой я сталкиваюсь с помощью функции rand (), иногда я получаю несколько повторяющихся чисел, у меня были дискретные значения в этом диапазоне, и каждый раз я вызываю другой порядок.

Ps: я прошел через некоторые потоки Генерировал случайный дубль в диапазоне Генерировал случайные числа равномерно по всему диапазону здесь и не смог точно подобрать один аналогмой, есть тонкая разница.особенно последний довольно близко

Ответы [ 5 ]

9 голосов
/ 13 ноября 2010

Кажется, больше проблема перетасовки проблемы рандомизации.

Хорошим началом является случайный случай Фишера-Йейтса , который начинается с отсортированного массива элементов и генерирует случайную перестановку:

int size = 10;
int *elements = malloc(sizeof(int)*size);

// inizialize
for (int i = 0; i < size; ++i)
  elements[i] = i;

for (int i = size - 1; i > 0; --i) {
  // generate random index
  int w = rand()%i;
  // swap items
  int t = elements[i];
  elements[i] = elements[w];
  elements[w] = t;
}
2 голосов
/ 13 ноября 2010

Вам будет легче, если вы начнете с массива с целыми числами 0-9 (или любым другим диапазоном), а затем случайным образом перемешаете его.Вот пример того, как сделать перетасовку здесь .

1 голос
/ 13 ноября 2010

Вы бы хотели рандомизировать массив [0, 1, ..., 9]. Вот пример C ++, который легко преобразовать в C:

0 голосов
/ 06 февраля 2017

Этот код только для целых чисел, но, надеюсь, этого будет достаточно.Я использую GCC для компиляции и только стандартную библиотеку C.Читайте комментарии для деталей.Ваши результаты будут иметь разные значения, но так как они будут случайными.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <errno.h> // http://man7.org/linux/man-pages/man3/errno.3.html

#define ERROR_MIN_MORE_MAX_VALUE "Min value is more max value, returned 0"


/*
    Returns a random integer in between min (inclusive) and max (inclusive)
    Returns 0 if min > max and to write a error message.
 */
static int
random_integer(const int min, const int max) {
    if (max == min) return min;
    else if (min < max) return rand() % (max - min + 1) + min;

    // return 0 if min > max
    errno = EINVAL;
    perror(ERROR_MIN_MORE_MAX_VALUE);
    return 0;
}


/*
    Fills an array with random integer values in a range
 */
static int
random_int_array(int array[], const size_t length, const int min, const int max){
    for (int i = 0; i < length; ++i) {
        array[i] = random_integer(min, max);
    }
    return 0;
}


/*
    Print an array of integer items
 */
void
print_int_array(int array[], size_t length) {
    char ending_charapter[] = ", ";
    putchar('[');
    for (size_t i = 0; i < length; ++i) {
        printf("%d", array[i]);
        if (i < length - 1) {
            printf("%s", ending_charapter);
        }
    }
    puts("]");
}


int
main (const int argc, const char *argv[])
{
    // for get a random integer number from a system, to pass a current time to the function srand
    srand(time(NULL));

    int arr[10];

    printf("\tAn array with random values from 0 to 100\n");
    random_int_array(arr, 10, 0, 100);
    print_int_array(arr, 10);

    printf("\n\tAn array with random values from -100 to 0\n");
    random_int_array(arr, 10, -100, 0);
    print_int_array(arr, 10);

    printf("\n\tAn array with random values from -100 to 100\n");
    random_int_array(arr, 10, -100, 100);
    print_int_array(arr, 10);

    return 0;
}

Результат

    An array with random values from 0 to 100
[86, 25, 98, 61, 42, 26, 87, 56, 86, 79]

    An array with random values from -100 to 0
[-33, -92, -57, -92, -6, -15, -61, -32, -75, -85]

    An array with random values from -100 to 100
[-15, -99, 54, 42, -74, 46, 6, -44, 86, -47]

Среда тестирования

$ lsb_release -a
No LSB modules are available.
Distributor ID: Debian
Description:    Debian GNU/Linux 8.6 (jessie)
Release:    8.6
Codename:   jessie
$ uname -a
Linux localhost 3.16.0-4-amd64 #1 SMP Debian 3.16.36-1+deb8u2 (2016-10-19) x86_64 GNU/Linux
$ gcc --version
gcc (Debian 4.9.2-10) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
0 голосов
/ 13 ноября 2010

+ Поместите все свои числа в массив результатов
+ от N до 2
+ ---- перемешать N элементов
+ возвращаемый массив

Пример

fillarray(arr, 10);
for (n = 10; n > 1; n++) shufflearray(arr, n);
/* done */


Редактировать --- спасибо downvoter!Я даже не догадывался, что выполняю там слишком много работы

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