Генератор случайных чисел с диапазоном?C ++ - PullRequest
0 голосов
/ 15 марта 2019

Я пытаюсь создать программу на C ++ для моего бизнеса на Ebay длиной 15 цифр, но я хочу, чтобы первые 5 цифр были одинаковыми.

Например: 152328476529876 PIN: 1000 152323123642345 PIN: 9433152321254213432 PIN: 3222

Я попытался создать генератор случайных чисел, но не могу получить его там, где первые 5 цифр совпадают, а последние 10 цифр совпадают.Со случайным пин-кодом.

#include <iostream>
#include <cstdlib> 
const int maximum_number = 9999999999;
const int minimum_number = 1;
unsigned int i;
const int maximum_pin = 999;
const int minimum_pin = 0;
unsigned int pin;
int main()
{

    // Print 100 random numbers
    for (int count = 0; count <= 1000; ++count)
    {
        const int new_number = (rand() % (maximum_number - minimum_number)) + maximum_number;
        const int new_pin = (rand() % (maximum_pin - minimum_pin)) + maximum_pin;
        std::cout << "15232" << new_number << " Pin : "<< new_pin << "\n";
    }

    return 0;
152321410094708 Pin : 1384

152321410073128 Pin : 1567 etc

Проблема, с которой я столкнулся, состоит в том, что первые 5 чисел одинаковы, как я и хочу, но затем 14100 остается прежним и также должен быть рандомизирован,не только последние 5 цифр ...

Плюс, штифты остаются только на 1000, они никогда не превышают 1999 и т. д.

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Вместо использования rand() и операций по модулю, вы должны использовать заголовок <random> из C ++ 11.Используя функциональный инструментарий Уолтера Е. Брауна из n3847 , вы можете использовать:

#include <cstdint>
#include <iostream>
#include <iomanip>
#include <random>

const uint64_t maximum_number = 9999999999;
const uint64_t minimum_number = 1;
const uint64_t maximum_pin = 9999;
const uint64_t minimum_pin = 0;
const uint64_t prefix = 15232;

auto& global_urbg() {
    static std::default_random_engine u{};
    return u;
}

void randomize() {
    static std::random_device rd{};
    global_urbg().seed(rd());
}

uint64_t pick_a_number(uint64_t from, uint64_t thru) {
    static std::uniform_int_distribution<uint64_t> d{};
    using parm_t = decltype(d)::param_type;
    return d(global_urbg(), parm_t{from, thru});
}

int main() {
    randomize();
    for (int count = 0; count < 100; ++count) {
        const uint64_t new_number = pick_a_number(minimum_number, maximum_number);
        const uint64_t new_pin = pick_a_number(minimum_pin, maximum_pin);
        std::cout << prefix << std::setw(10) << std::setfill('0') << new_number
                  << " Pin : " << std::setw(4) << std::setfill('0') << new_pin << "\n";
    }

    return 0;
}

Пример вывода:

152325021252553 Pin : 1766
152327824160815 Pin : 7717
152321697896629 Pin : 3659
152320879192254 Pin : 8832
152325057425972 Pin : 2831
152323353939394 Pin : 1681
152324684928448 Pin : 9800
152328117866049 Pin : 4173
152326884989008 Pin : 4663
152320007759205 Pin : 7264
152327718061191 Pin : 3968
152322605655403 Pin : 8213
152324442390907 Pin : 7916
152322386351545 Pin : 4683
152321687805442 Pin : 3886
152328171047426 Pin : 6344
152327001747780 Pin : 2636
152325373164268 Pin : 3676
0 голосов
/ 15 марта 2019

Ваша проблема здесь в том, что генерация случайного числа с помощью rand () дает вам число от 0 до как минимум 32767 (в зависимости от вашей платформы см. здесь ), и это число недостаточно велико. Другая проблема состоит в том, что тип данных int не имеет достаточно битов для хранения такого большого числа.

Это все очень зависит от платформы, но это минимальные размеры:

  • int использует не менее 16 битов, которые могут хранить числа от 0 до 65536 (если не подписано)
  • long использует как минимум 32 бита, которые могут хранить числа от 0 до 4294967296 (без знака)
  • long long использует как минимум 64 бита, которые могут хранить числа от 0 до 18446744073709551616 (если не подписано)

Итак, у вас уже есть проблема с вашими максимальными значениями, так как они не помещаются в int. Если вы хотите быть уверены, насколько большими могут быть ваши номера, вы можете использовать stdint.h и указать свой ints с uint64, int32 и т. Д.

То, что вы хотите, это 10 случайных цифр. Это может быть достигнуто с помощью чего-то вроде этого:

for (int count = 0; count < 1000; count++) {
    // leading number must not be 0
    long long randomNumber = (rand() % 9) + 1;

    for (int i = 0; i<9; i++) {
        randomNumber *= 10;
        randomNumber += rand() % 10;
    }
    std::cout << "15232" << new_number << "\n";
}

Пин-код имеет похожую проблему, я думаю

...