Как связать числа вместе в целое число без добавления?

#c #random

#c #Случайный

Вопрос:

Например: если я получаю несколько цифр, и все эти числа генерируются случайным образом (1-9), всего до 7 цифр, и я хочу, чтобы все они были целым целым числом, как мне это сделать?

Вот что я пробовал:

 static void generate_key(std::map<std::string, int>amp; key, std::string c_user)
{
    unsigned int hold[7]{}; // will hold all the random integers seperate to add onto final
    int *final = new int; // will store a complete 7 digit integer here later on

    for (int i = 0; i < 7; i  )
    {
        unsigned int num = rand() % 9;
        hold[i] = num;
    }

    *final = hold[0]   hold[1]   hold[2]   hold[3]; // I know this sums everything but how do I get it to just add all the numbers into a single integer?!
    key.emplace(c_user, final);

    std::cout << "Key created: " << *final << 'n';

    delete final;
}
 

Храните все целые числа отдельно друг от друга:

 unsigned int hold[7]{};
 

Создание случайных цифр:

 for (int i = 0; i < 7; i  )
        {
            unsigned int num = rand() % 9;
            hold[i] = num;
        }
 

Сохраняйте и добавляйте все целые числа в *final целое число

 int *final = new int;
 

Я хочу сгенерировать 7-значный ключ, и каждая отдельная цифра рандомизирована. Затем я хочу сложить их все, чтобы получить целое целое число, которое помещается в карту, где строка уже создана, и этот ключ будет представлять строку. Вы понимаете, что я здесь говорю? Извините, если мое объяснение ужасно, я просто слишком потерян здесь..

Вот полный код, если это полезно:

 #include <iostream>
#include <string>
#include <map>
#include <vector>
#include <stdlib.h>

class Account
{
private:
    std::string username;
    std::string password;
public:
    Account(std::string username, std::string password)
    {
        this->username = username;
        this->password = password;
    }
    ~Account() {};

    std::string get_username()const { return username; }
    std::string get_password()const { return password; }
};

static void create_account(std::string user, std::string pass, std::vector<Account> amp;acc)
{
    Account *account = new Account(user, pass);

    acc.push_back(*account);

    delete account;
}

static void generate_key(std::map<std::string, int>amp; key, std::string c_user)
{
    unsigned int hold[7]{};
    int *final = new int;

    for (int i = 0; i < 7; i  )
    {
        unsigned int num = rand() % 9;
        hold[i] = num;
    }

    *final = hold[0]   hold[1]   hold[2]   hold[3];

    key.emplace(c_user, final);

    std::cout << "Key created: " << *final << 'n';

    delete final;
}

std::vector<Account> accounts;
std::map<std::string, int> keys;

int main()
{
    srand(time(NULL));

    create_account("random", "triathlon", accounts);
    generate_key(keys, accounts[0].get_username());

    return 0;
}

static void create_account(std::string, std::string, std::vector<Account> amp;acc);
static void generate_key(std::map<std::string, int>amp;, std::string);
 

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

1. Вы хотите сгенерировать случайное 7-значное число, в котором все цифры уникальны?

2. Да!! Я усложняю ситуацию или я на правильном пути idk lol

3. Вы излишне создаете указатели.

4. Почему это так?

5. ~Account() {}; — Избавьтесь от этого. Не кодируйте пустые, ничего не делающие деструкторы. Либо удалите его, либо пометьте деструктор как =defau< . Причина в том, что пустое тело деструктора изменяет все свойства класса с тривиально разрушаемых на нетривиально разрушаемые. Само по себе это может привести к тому, что компилятор сгенерирует неоптимальный код.

Ответ №1:

Если вы хотите сгенерировать 7-значное число, в котором все цифры уникальны, то вы можете сохранить действительные цифры в a vector , а затем shuffle в этом векторе и взять первые 7 элементов в качестве цифры, чтобы составить число. Это можно было бы сделать следующим образом:

 std::vector<char> digits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'}
std::random_device rd;
std::mt19937 g(rd());
std::suffle(digits.being(), digits.end(), g);
std::string number{digits.begin(), digits.begin()   7}
 

и теперь number это 7-значная строка, где каждая цифра появляется только один раз. Если вы не хотите иметь начальный ноль, вам нужно будет проверить, является ли первый элемент нулем, и если да, снова перемешайте или просто возьмите элементы с 1 по 7.

Если вы просто хотите сгенерировать 7-значное число, но вам все равно, есть ли повторяющиеся цифры, то вы можете сделать это с помощью a std::string и простого цикла for, например:

 std::random_device rd;
std::mt19937 g(rd());
std::uniform_int_distribution<> dist(0, 9);
std::string number;
for (int i = 0; i < 7;   i)
{
    number.push_back('0'   dist(g))
}
 

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

1. Самое простое объяснение на сегодняшний день. Никогда не думал о технике, использующей shuffle. Спасибо!

Ответ №2:

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

Я забыл, как называется этот алгоритм.

В вашем случае вам нужно выполнить только семь итераций, начиная с девяти цифр. Код ниже:

 #include <vector>
#include <array>
#include <algorithm>
#include <iostream>

int remove_rnd_item( std::vector<int>amp; digits ) {
    int n = rand() % digits.size(); // should use a better RNG...
    int rnd_digit = digits[n];
    //swap with the last digit and pop...
    std::swap(digits[n], digits.back());
    digits.pop_back();
    return rnd_digit;
}

int random_seven_digit_number_with_unique_digits() {
    std::vector<int> digits = { 0,1,2,3,4,5,6,7,8,9 };
    std::array<int, 7> rnd_digits;
    std::generate(rnd_digits.begin(), rnd_digits.end(),
        [amp;digits]() {
            return remove_rnd_item(digits);
        }
    );
    // convert the digits vector to a single int, if that is what you want
    int tens_place = 1;
    int val = 0;
    for (auto digit : rnd_digits) {
        val  = tens_place * digit;
        tens_place *= 10;
    }
    return val;
}

int main() {
    for (int i = 0; i < 10;   i) {
        std::cout << random_seven_digit_number_with_unique_digits() << "n";
    }
}
 

Ответ №3:

Я предполагаю, что требование иметь все уникальные цифры в идентификаторе клиента ошибочно.

Чтобы получить случайное 7-значное число, вам нужно только:

 #include <random>
#include <iostream>

int main()
{
    std::random_device rd;  //Will be used to obtain a seed for the random number engine
    std::mt19937 gen(rd()); //Standard mersenne_twister_engine seeded with rd()
    std::uniform_int_distribution<> distrib(0, 9'999'999);

    std::cout << distrib(gen) << std::endl;
}
 

Если вы хотите избежать начальных нулей, используйте distrib(1'000'000, 9'999'999);

Ответ №4:

Уииии! Привет!.Я тоже новичок !. и да. Я думаю, вы можете сделать это так !.

 int boop(){
    int ding=1000000;
    int a[7]={1,4,6,3,4,2,4};
    int re=0;
    for(int i=0;i<7;i  ){
        re =a[i]*ding;
        ding/=10;
    }
    return re;
}
 

или просто создайте свою собственную функцию для создания случайного числа в диапазоне от 0 до 1. и умножьте его на 9999999. (вроде как рекомендуется).

 #include <iostream>
#include <math.h>
float boop(int seed){
    return abs(sin( cos(seed*3972)*38472));
}
int main(){
    float f=boop(34)*9999999;
    std::cout<<(int)f;
    return 0;
}