Загрузка...

How to do number generation?

Thread in C/C++ created by KleverAN Feb 27, 2023. 263 views

  1. KleverAN
    KleverAN Topic starter Feb 27, 2023 3 Jan 13, 2020
    Вообщем, нужно сделать генерацию чисел и их запись в массив без их повторения.

    Код С++
    Code
    #include <iostream>
    #include <ctime>
    using namespace std;

    void fillArray(int arr[], int size) {

    srand(time(NULL));

    for (int i = 0; i < size; i++) {
    bool already;
    do {
    already = false;
    arr[i] = rand() % 100; //generate nums
    //check nums
    for (int j = 0; j < i; j++) {
    if (arr[j] == arr[i]) {
    already = true;
    break;
    }
    }
    } while (already);
    }
    }

    int main()
    {
    const int SIZE = 40;
    int arrA[SIZE];
    int arrB[SIZE];
    int arrC[SIZE];
    fillArray(arrA, SIZE);
    fillArray(arrB, SIZE);
    fillArray(arrC, SIZE);
    for (int i = 0; i < SIZE; i++) {
    cout << arrA[i] << " ";
    }
    cout << endl;
    for (int i = 0; i < SIZE; i++) {
    cout << arrB[i] << " ";
    }
    cout << endl;
    for (int i = 0; i < SIZE; i++) {
    cout << arrC[i] << " ";
    }

    return 0;
    }
    Дело в том, что функция генерирует так сказать одинаковые числа для разных массивов, хотя это и очевидно,
    Не подскажите как сделать разные числа для разных массивов :thinking:
    [IMG]
     
    1. Membro
  2. unnamed
    unnamed Feb 27, 2023 In Bitcoin We Trust
    Проблема заключается в том, что вы используете один и тот же генератор случайных чисел для всех трех массивов. Это означает, что при каждом вызове функции fillArray, вы начинаете генерировать случайные числа с той же самой начальной точки.

    Чтобы получить разные числа для каждого массива, вам нужно использовать разные начальные точки для генератора случайных чисел. Вы можете сделать это, например, передавая разные значения time(NULL) в качестве аргумента функции srand для каждого вызова.

    Вот как может выглядеть измененный код fillArray, учитывающий это:
    Code
    void fillArray(int arr[], int size, int seed) {

    srand(seed);

    for (int i = 0; i < size; i++) {
    bool already;
    do {
    already = false;
    arr[i] = rand() % 100; //generate nums
    //check nums
    for (int j = 0; j < i; j++) {
    if (arr[j] == arr[i]) {
    already = true;
    break;
    }
    }
    } while (already);
    }
    }
    И затем вызывайте функцию fillArray для каждого массива, передавая разные значения time(NULL):
    Code
    const int SIZE = 40;
    int arrA[SIZE];
    int arrB[SIZE];
    int arrC[SIZE];
    fillArray(arrA, SIZE, time(NULL));
    fillArray(arrB, SIZE, time(NULL) + 1); // добавляем 1 секунду к первой начальной точке
    fillArray(arrC, SIZE, time(NULL) + 2); // добавляем 2 секунды к первой начальной точке
    Таким образом, каждый вызов fillArray будет использовать свой уникальный генератор случайных чисел, начиная с разных начальных точек, что приведет к генерации разных наборов случайных чисел для каждого массива.
     
    1. Daemon
      unnamed, Зерно генерации это называется.
  3. Silent_screams
    Silent_screams Feb 27, 2023 Banned 0 Feb 25, 2023
     
  4. HaKerHD93
    HaKerHD93 Feb 27, 2023 57 Oct 15, 2018
    Вариант предоставленный unnamed хороший. но srand не очень хороший ГПСЧ (лично по моему субъективному мнению, Вы в праве пользоваться хоть srand, хоть mt19937. Как вашей душе угодно). Поэтому хочу предложу иной ГПСЧ - mt19937.
    Пример уже готового mt19937:
    Code
            std::mt19937 mt;
    std::random_device rd;
    mt.seed(rd() ^ (
    (std::mt19937::result_type)
    std::chrono::duration_cast<std::chrono::seconds>(
    std::chrono::system_clock::now().time_since_epoch()
    ).count() +
    (std::mt19937::result_type)
    std::chrono::duration_cast<std::chrono::microseconds>(
    std::chrono::high_resolution_clock::now().time_since_epoch()
    ).count()));
    std::uniform_int_distribution<int> dist(50, 200);
    int rand = dist(mt);
    p = mt() % rand;
     
    1. LVV
      HaKerHD93, это вихрь мерсенна? впервые вижу чтобы использовали его, ибо в 11 версии srand/rand работают прекрасно с учетом посредственности.

      + то что ты написал или скопировал это ужасная реализация. проще было линейку использовать.
    2. Daemon
      LVV, Какая еще 11 версия, если srand/rand это из Си?
    3. View the next comments (3)
Top
Loading...