ฉันจะสร้างสตริงตัวอักษรและตัวเลขแบบสุ่มใน C ++ ได้อย่างไร


180

ฉันต้องการสร้างสตริงแบบสุ่มซึ่งประกอบด้วยตัวอักษรและตัวเลข ฉันต้องการที่จะสามารถระบุความยาวของสตริง

ฉันจะทำสิ่งนี้ใน C ++ ได้อย่างไร

คำตอบ:


288

คำตอบของ Mehrdad Afshari จะใช้กลอุบาย แต่ฉันพบว่ามันละเอียดเกินไปสำหรับงานง่าย ๆ นี้ ตารางการค้นหาบางครั้งสามารถทำสิ่งมหัศจรรย์ได้:

void gen_random(char *s, const int len) {
    static const char alphanum[] =
        "0123456789"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "abcdefghijklmnopqrstuvwxyz";

    for (int i = 0; i < len; ++i) {
        s[i] = alphanum[rand() % (sizeof(alphanum) - 1)];
    }

    s[len] = 0;
}

5
@ เคนต์: นั่นคือสิ่งที่ทีม OpenSSL แม้ว่าจนกระทั่งมีคนคิดว่าจะใส่รหัสผ่าน valgrind ;-)
Konrad Rudolph

11
คุณอาจไม่ต้องการใช้แรนด์แบบง่าย () กับโมดูลัส ดู: c-faq.com/lib/randrange.html
แรนดี้พรอคเตอร์

5
ฉันคิดว่าสายs[len] = 0ไม่ถูกต้อง ถ้าsเป็นสตริง C (ยกเลิกเป็นโมฆะ) แล้วลายเซ็นของวิธีการจะไม่ต้องมีlenพารามิเตอร์ในนั้น Imo ถ้าคุณผ่านความยาวเป็นอาร์กิวเมนต์คุณจะถือว่าอาร์เรย์ไม่ใช่สตริง C ดังนั้นหากคุณไม่ได้ส่งผ่านสตริง C ไปยังฟังก์ชั่นบรรทัดs[len] = 0อาจทำให้บางสิ่งแตกต่างกันได้เนื่องจากอาร์เรย์จะเปลี่ยนจาก 0 เป็น len-1 และแม้ว่าคุณจะผ่านสตริง C ไปยังฟังก์ชันบรรทัดs[len] = 0ก็จะซ้ำซ้อน
เฟลิเป้

16
โปรดใช้ C ++ 11 หรือเพิ่มการสุ่มเราอยู่ในปี 2559 ตอนนี้
Nikko

13
เราต้องการวิธีที่จะตอบคำถามที่ล้าสมัยใน stackoverflow
Velkan

107

นี่คือการปรับคำตอบของ Ates Goral โดยใช้ C ++ 11 ฉันได้เพิ่มแลมบ์ดาไว้ที่นี่แล้ว แต่หลักการคือคุณสามารถผ่านเข้าไปได้และควบคุมสิ่งที่สตริงของคุณมี:

std::string random_string( size_t length )
{
    auto randchar = []() -> char
    {
        const char charset[] =
        "0123456789"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "abcdefghijklmnopqrstuvwxyz";
        const size_t max_index = (sizeof(charset) - 1);
        return charset[ rand() % max_index ];
    };
    std::string str(length,0);
    std::generate_n( str.begin(), length, randchar );
    return str;
}

นี่คือตัวอย่างของการส่งแลมบ์ดาไปยังฟังก์ชันสตริงสุ่ม: http://ideone.com/Ya8EKf

ทำไมคุณจะใช้ภาษา C ++ 11 ?

  1. เนื่องจากคุณสามารถสร้างสตริงที่ตามการแจกแจงความน่าจะเป็น (หรือชุดค่าผสมการกระจาย) สำหรับชุดอักขระที่คุณสนใจ
  2. เพราะมันมีระบบรองรับในตัว ตัวเลขสุ่มแบบไม่กำหนดค่า
  3. เนื่องจากรองรับยูนิโคดดังนั้นคุณสามารถเปลี่ยนเป็นเวอร์ชันสากลได้

ตัวอย่างเช่น:

#include <iostream>
#include <vector>
#include <random>
#include <functional> //for std::function
#include <algorithm>  //for std::generate_n

typedef std::vector<char> char_array;

char_array charset()
{
    //Change this to suit
    return char_array( 
    {'0','1','2','3','4',
    '5','6','7','8','9',
    'A','B','C','D','E','F',
    'G','H','I','J','K',
    'L','M','N','O','P',
    'Q','R','S','T','U',
    'V','W','X','Y','Z',
    'a','b','c','d','e','f',
    'g','h','i','j','k',
    'l','m','n','o','p',
    'q','r','s','t','u',
    'v','w','x','y','z'
    });
};    

// given a function that generates a random character,
// return a string of the requested length
std::string random_string( size_t length, std::function<char(void)> rand_char )
{
    std::string str(length,0);
    std::generate_n( str.begin(), length, rand_char );
    return str;
}

int main()
{
    //0) create the character set.
    //   yes, you can use an array here, 
    //   but a function is cleaner and more flexible
    const auto ch_set = charset();

    //1) create a non-deterministic random number generator      
    std::default_random_engine rng(std::random_device{}());

    //2) create a random number "shaper" that will give
    //   us uniformly distributed indices into the character set
    std::uniform_int_distribution<> dist(0, ch_set.size()-1);

    //3) create a function that ties them together, to get:
    //   a non-deterministic uniform distribution from the 
    //   character set of your choice.
    auto randchar = [ ch_set,&dist,&rng ](){return ch_set[ dist(rng) ];};

    //4) set the length of the string you want and profit!        
    auto length = 5;
    std::cout<<random_string(length,randchar)<<std::endl;
    return 0;
}

ตัวอย่างผลลัพธ์


โปรดทราบว่าอย่างน้อยใน MSVC 2012 คุณจะต้อง const อัตโนมัติ randSeed = std :: random_device () จากนั้นผ่าน randSeed ไปยัง std :: default_random_engine () std :: random_device {} () ไม่สามารถคอมไพล์กับเวอร์ชันนี้
NuSkooler

8
หากคุณใช้ C ++ 11 จะดีกว่าหรือไม่ที่จะไม่ใช้rand()ในข้อมูลโค้ดแรกของคุณ
Ehtesh Choudhury

C ++ 11 ช่วยให้คุณสามารถแยกตัวสร้างออกจากเครื่องยนต์ แต่สิ่งที่ดีที่สุดขึ้นอยู่กับความต้องการของแอปพลิเคชันของคุณ นี่คือเหตุผลที่ตัวอย่างแรกของฉันใช้ rand และอันที่สองไม่ได้
Carl

7
ฉันจะเถียงว่ามันไม่ถูกต้องที่จะใช้rand()อีกต่อไป มันไม่เหมือนกันแม้แต่ในการร้องไห้ออกมาดัง ๆ ...
jeremyong

1
@Carl ฉันคิดว่าในชุมชน C ++, แรนด์ถูกคัดค้านและรูปแบบการต่อต้านที่รู้จักกันดีด้วยเหตุผลหลายประการนอกเหนือจากความไม่สม่ำเสมอ (ดูคำพูดของ STL "Rand Considered Harmful") นามธรรมของเครื่องกำเนิดไฟฟ้าจากมุมมองเป็นแนวคิด C ++ ทั่วไปที่ฉันคิดว่าเป็นสิ่งสำคัญสำหรับผู้ปฏิบัติงานและนักเรียนของ C ++ ที่จะเรียนรู้ (พิจารณาวิธีการดำเนินการไปยัง std :: chrono, std :: string_view ฯลฯ )
jeremyong

39

โซลูชัน 2p ของฉัน:

#include <random>
#include <string>

std::string random_string(std::string::size_type length)
{
    static auto& chrs = "0123456789"
        "abcdefghijklmnopqrstuvwxyz"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

    thread_local static std::mt19937 rg{std::random_device{}()};
    thread_local static std::uniform_int_distribution<std::string::size_type> pick(0, sizeof(chrs) - 2);

    std::string s;

    s.reserve(length);

    while(length--)
        s += chrs[pick(rg)];

    return s;
}

อาจจะใช้default_random_engineแทนmt19937? รหัสจะมีลักษณะทั่วไปมากขึ้น
Velkan

1
@Velkan ความซื่อสัตย์std::default_random_engineไม่ใช่สิ่งที่ฉันรู้สึกดีเกี่ยวกับการแนะนำเนื่องจากมาตรฐานไม่รับประกันเกี่ยวกับคุณภาพประสิทธิภาพหรือความสามารถในการทำซ้ำระหว่างการนำไปใช้งาน
Galik

1
หลีกเลี่ยงการใช้ตัวอักษรถ่านอาร์เรย์และทำให้มีการใช้งานsizeofเปลี่ยนauto&ไปstd::stringซึ่งจะช่วยให้คุณstd::string::length
smac89

ฉันรู้สึกว่าการเข้าถึง a std::stringน่าจะช้ากว่าเพราะมีตัวชี้ภายในไปยังข้อมูล นั่นจะหมายถึงการเสริมทางอ้อมที่อาร์เรย์คงที่ไม่ต้องการ ยังsizeofไม่สามารถช้ากว่าstd::string::sizeเพราะเป็นค่าคงที่เวลารวบรวม
Galik

1
@ ลำดับเวลาใช่แน่นอนว่าจะดีกว่า อย่างไรก็ตามstd::sizeยังไม่ปรากฏจนกระทั่งC++17และยังมีผู้คนจำนวนมากเท่านั้นที่เข้ารหัสC++11/14ดังนั้นฉันจะปล่อยให้มันเป็นตอนนี้
Galik

14
 void gen_random(char *s, size_t len) {
     for (size_t i = 0; i < len; ++i) {
         int randomChar = rand()%(26+26+10);
         if (randomChar < 26)
             s[i] = 'a' + randomChar;
         else if (randomChar < 26+26)
             s[i] = 'A' + randomChar - 26;
         else
             s[i] = '0' + randomChar - 26 - 26;
     }
     s[len] = 0;
 }

Nice: นี่เป็นอิสระจากชุดอักขระ (อย่างน้อยสำหรับชุดอักขระทั้งหมดที่มี a. z, A..Z และ 0..9 ต่อเนื่อง)
dmckee --- ผู้ดูแลอดีตลูกแมว

2
@dmckee: จริง แต่ชุดอักขระอื่น ๆ คืออะไรบ้าง (EBCDIC ไม่มีตัวอักษรที่ต่อเนื่องกัน)
Greg Hewgill

1
หนอ ฉันเดาว่าฉันถูกจับได้ ผมก็แค่ parroting สิ่งที่อาจารย์พูดกับผมอีกครั้ง ...
dmckee --- อดีตผู้ดูแลลูกแมว

การตรวจสอบอย่างรวดเร็วของมาตรฐานไม่แสดงความต้องการความต่อเนื่องดังกล่าวในหัวข้อ 2.2 ที่ฉันคาดหวังไว้
David Thornley

2
แม้ว่า 0..9 จะต้องต่อเนื่องกัน ไม่มีหมายเลขส่วน แต่ฉันแน่ใจเกี่ยวกับสิ่งนี้
Johannes Schaub - litb

10

ฉันเพิ่งทดสอบมันใช้งานได้ดีและไม่ต้องใช้ตารางการค้นหา rand_alnum () เรียงลำดับกองกำลังออกจากตัวอักษรและตัวเลข แต่เนื่องจากมันเลือก 62 ตัวจาก 256 ตัวอักษรที่เป็นไปได้จึงไม่ใช่เรื่องใหญ่

#include <cstdlib>   // for rand()
#include <cctype>    // for isalnum()   
#include <algorithm> // for back_inserter
#include <string>

char 
rand_alnum()
{
    char c;
    while (!std::isalnum(c = static_cast<char>(std::rand())))
        ;
    return c;
}


std::string 
rand_alnum_str (std::string::size_type sz)
{
    std::string s;
    s.reserve  (sz);
    generate_n (std::back_inserter(s), sz, rand_alnum);
    return s;
}

8
ไม่มีวิธีที่จะรู้ว่าฟังก์ชั่นนี้จะใช้เวลานานแค่ไหน มันไม่น่าเป็นไปได้มาก แต่พูดอย่างเคร่งครัดสิ่งนี้สามารถทำงานได้อย่างไม่มีกำหนด
ctrlc-root

9

แทนที่จะวนลูปด้วยตนเองต้องการใช้อัลกอริทึม C ++ที่เหมาะสมในกรณีนี้std::generate_nด้วยตัวสร้างตัวเลขสุ่มที่เหมาะสม :

auto generate_random_alphanumeric_string(std::size_t len) -> std::string {
    static constexpr auto chars =
        "0123456789"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
        "abcdefghijklmnopqrstuvwxyz";
    thread_local auto rng = random_generator<>();
    auto dist = std::uniform_int_distribution{{}, std::strlen(chars) - 1};
    auto result = std::string(len, '\0');
    std::generate_n(begin(result), len, [&]() { return chars[dist(rng)]; });
    return result;
}

นี่ใกล้เคียงกับบางสิ่งที่ฉันเรียกว่า "มาตรฐาน" ของปัญหานี้

น่าเสียดายที่การเพาะเครื่องกำเนิดหมายเลขสุ่ม C ++ อย่างถูกต้อง (เช่น MT19937) นั้นยากมาก รหัสด้านบนจึงใช้เทมเพลตฟังก์ชันตัวช่วยrandom_generator:

template <typename T = std::mt19937>
auto random_generator() -> T {
    auto constexpr seed_bits = sizeof(typename T::result_type) * T::state_size;
    auto constexpr seed_len = seed_bits / std::numeric_limits<std::seed_seq::result_type>::digits;
    auto seed = std::array<std::seed_seq::result_type, seed_len>{};
    auto dev = std::random_device{};
    std::generate_n(begin(seed), seed_len, std::ref(dev));
    auto seed_seq = std::seed_seq(begin(seed), end(seed));
    return T{seed_seq};
}

สิ่งนี้มีความซับซ้อนและไม่มีประสิทธิภาพ โชคดีที่มันถูกใช้เพื่อเริ่มต้นthread_localตัวแปรดังนั้นจึงเรียกใช้เพียงครั้งเดียวต่อเธรด

ในที่สุดสิ่งที่จำเป็นรวมถึงสำหรับข้างต้นคือ:

#include <algorithm>
#include <array>
#include <cstring>
#include <functional>
#include <limits>
#include <random>
#include <string>

รหัสด้านบนใช้การลดอาร์กิวเมนท์ของคลาสเทมเพลตดังนั้นจึงต้องใช้ C ++ 17 สามารถปรับได้เล็กน้อยสำหรับรุ่นก่อนหน้าโดยเพิ่มอาร์กิวเมนต์เทมเพลตที่ต้องการ


มันเป็นเพียงการอนุมานstd::size_tเพื่อstd::uniform_int_distribution? ฉันไม่เห็น CTAD อื่นใด
Caleth

@Caleth ถูกต้อง (ทำไม) สิ่งนี้ทำให้คุณประหลาดใจ
Konrad Rudolph

ฉันอยากจะแนะนำให้ใช้rngเป็นพารามิเตอร์ที่ผิดนัดโดยมีบางอย่างเช่นtemplate <typename T = std::mt19937> inline thread_local T default_rng = get_random_generator<T>();
Caleth

ฉันใช้เวลาไม่กี่วินาทีที่จะเห็นมันเลย ฉันอาจใช้การแทนที่ทางจิตใจstd::uniform_int_distribution<>ซึ่งอาจปลอดภัย แต่อาจเตือนเกี่ยวกับการแปลงที่ไม่ได้ลงชื่อ ->
Caleth

6

ฉันหวังว่านี่จะช่วยให้ใครบางคน

ทดสอบที่https://www.codechef.com/ideด้วย C ++ 4.9.2

#include <iostream>
#include <string>
#include <stdlib.h>     /* srand, rand */

using namespace std;

string RandomString(int len)
{
   string str = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
   string newstr;
   int pos;
   while(newstr.size() != len) {
    pos = ((rand() % (str.size() - 1)));
    newstr += str.substr(pos,1);
   }
   return newstr;
}

int main()
{
   srand(time(0));
   string random_str = RandomString(100);
   cout << "random_str : " << random_str << endl;
}

Output: random_str : DNAT1LAmbJYO0GvVo4LGqYpNcyK3eZ6t0IN3dYpHtRfwheSYipoZOf04gK7OwFIwXg2BHsSBMB84rceaTTCtBC0uZ8JWPdVxKXBd


3
บวก 1, ลบ 1: ผู้อ่าน, ระวัง: RandomString(100)! ;-)
azhrei

2
รหัสนี้ยังใช้งานไม่ได้และมีปัญหาหลายอย่าง ที่สำคัญที่สุดstd::srand()ควรเรียกเพียงครั้งเดียวตอนเริ่มต้นโปรแกรม (โดยเฉพาะอย่างยิ่งสิ่งแรกที่เข้ามาmain()) รหัสตามที่เป็นอยู่จะสร้างสตริง "สุ่ม" ที่เหมือนกันจำนวนมากหากถูกเรียกในวงวน
กาลิก

4

นี่คือหนึ่งซับตลก ต้องการ ASCII

void gen_random(char *s, int l) {
    for (int c; c=rand()%62, *s++ = (c+"07="[(c+16)/26])*(l-->0););
}

2
#include <iostream>
#include <string>
#include <random>

std::string generateRandomId(size_t length = 0)
{
    static const std::string allowed_chars {"123456789BCDFGHJKLMNPQRSTVWXZbcdfghjklmnpqrstvwxz"};

    static thread_local std::default_random_engine randomEngine(std::random_device{}());
    static thread_local std::uniform_int_distribution<int> randomDistribution(0, allowed_chars.size() - 1);

    std::string id(length ? length : 32, '\0');

    for (std::string::value_type& c : id) {
        c = allowed_chars[randomDistribution(randomEngine)];
    }

    return id;
}

int main()
{
    std::cout << generateRandomId() << std::endl;
}

1
ควรเป็น randomDistribution (0, sizeof (allow_chars) - 2);
Archie

@Archie ทำไม ดูดี (minIndex, maxIndex) en.cppreference.com/w/cpp/numeric/random/…
Oleg

1
เนื่องจาก allow_chars [] มีอักขระ '\ 0' อยู่ด้วย
Archie

@Archie คุณถูกต้องwandbox.org/permlink/pxMJfSbhI4MxLGESขอบคุณ!
Oleg

ฉันอัปเดตโซลูชันให้ใช้std::stringแทนstd::string::value_type[]
Oleg

1

มีบางอย่างที่ง่ายและพื้นฐานมากขึ้นในกรณีที่คุณมีความสุขที่จะให้สตริงมีอักขระที่พิมพ์ได้:

#include <time.h>   // we'll use time for the seed
#include <string.h> // this is for strcpy

void randomString(int size, char* output) // pass the destination size and the destination itself
{
    srand(time(NULL)); // seed with time

    char src[size];
    size = rand() % size; // this randomises the size (optional)

    src[size] = '\0'; // start with the end of the string...

    // ...and work your way backwards
    while(--size > -1)
        src[size] = (rand() % 94) + 32; // generate a string ranging from the space character to ~ (tilde)

    strcpy(output, src); // store the random string
}

1
ฉันคิดว่านี่เป็นทางออกที่ง่ายที่สุดและเหมาะอย่างยิ่งสำหรับกรณีที่มีชุดอักขระที่ระบุ
VolAnd

1

สตริงสุ่มทุกไฟล์ที่ทำงาน = สตริงที่แตกต่างกัน

        auto randchar = []() -> char
    {
        const char charset[] =
            "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
            "abcdefghijklmnopqrstuvwxyz";

        const size_t max_index = (sizeof(charset) - 1);

        return charset[randomGenerator(0, max_index)];
    };
            std::string custom_string;
            size_t LENGTH_NAME = 6 // length of name
    generate_n(custom_string.begin(), LENGTH_NAME, randchar);

นี่คือพฤติกรรมที่ไม่ได้กำหนดเพราะstd::generate_nจะถือว่าcustom_stringมีความยาวLENGTH_NAMEแต่มันไม่ได้
Cornstalks

1

ตัวอย่างการใช้ Qt :)

QString random_string(int length=32, QString allow_symbols=QString("abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")) {
    QString result;
    qsrand(QTime::currentTime().msec());
    for (int i = 0; i < length; ++i) {            
        result.append(allow_symbols.at(qrand() % (allow_symbols.length())));
    }
    return result;
}

คุณอธิบายรายละเอียดเกี่ยวกับคำตอบของคุณได้ไหม? การโพสต์โค้ดเพียงบางส่วนมักไม่ค่อยมีประโยชน์
Noel Widmer

1

ลองสุ่มให้สะดวกอีกครั้ง!

ฉันสร้าง C ++ 11 ส่วนหัวที่ดีสำหรับการแก้ปัญหาเท่านั้น คุณสามารถเพิ่มไฟล์ส่วนหัวหนึ่งไฟล์ในโครงการของคุณได้อย่างง่ายดายจากนั้นเพิ่มการทดสอบหรือใช้สตริงแบบสุ่มเพื่อวัตถุประสงค์อื่น

นั่นเป็นคำอธิบายอย่างรวดเร็ว แต่คุณสามารถไปที่ลิงก์เพื่อตรวจสอบรหัสเต็ม ส่วนหลักของการแก้ปัญหาอยู่ในระดับ Randomer:

class Randomer {
    // random seed by default
    std::mt19937 gen_;
    std::uniform_int_distribution<size_t> dist_;

public:
    /* ... some convenience ctors ... */

    Randomer(size_t min, size_t max, unsigned int seed = std::random_device{}())
        : gen_{seed}, dist_{min, max} {
    }

    // if you want predictable numbers
    void SetSeed(unsigned int seed) {
        gen_.seed(seed);
    }

    size_t operator()() {
        return dist_(gen_);
    }
};

Randomerรวบรวมข้อมูลแบบสุ่มทั้งหมดและคุณสามารถเพิ่มฟังก์ชันการทำงานของคุณเองได้อย่างง่ายดาย หลังจากที่เรามีRandomerมันเป็นเรื่องง่ายมากที่จะสร้างสตริง:

std::string GenerateString(size_t len) {
    std::string str;
    auto rand_char = [](){ return alphabet[randomer()]; };
    std::generate_n(std::back_inserter(str), len, rand_char);
    return str;
}

เขียนคำแนะนำของคุณเพื่อปรับปรุงด้านล่าง https://gist.github.com/VjGusev/e6da2cb4d4b0b531c1d009cd1f8904ad


0

การปรับตัวอีกอย่างหนึ่งเพราะไม่ใช่คำตอบจะเพียงพอต่อความต้องการของฉัน ก่อนอื่นถ้าแรนด์ () ถูกใช้เพื่อสร้างตัวเลขสุ่มคุณจะได้ผลลัพธ์เหมือนกันทุกครั้ง seed สำหรับตัวสร้างจำนวนสุ่มต้องเป็นแบบสุ่ม ด้วย C ++ 11 คุณสามารถรวมไลบรารี "random" และคุณสามารถเริ่มต้นเมล็ดด้วย random_device และ mt19937 เมล็ดพันธุ์นี้จะถูกจัดทำโดยระบบปฏิบัติการและมันจะสุ่มพอสำหรับเรา (เช่น: นาฬิกา) คุณสามารถกำหนดขอบเขตของช่วงได้รวม [0,25] ในกรณีของฉัน และสุดท้าย แต่ไม่ท้ายสุดฉันต้องการตัวอักษรตัวพิมพ์เล็กอย่างเดียวเท่านั้นดังนั้นฉันจึงใช้การเพิ่มอักขระ ด้วยแนวทางของตัวละครที่ไม่ได้ผลสำหรับฉัน

#include <random>    
void gen_random(char *s, const int len){
    static std::random_device rd;
    static std::mt19937 mt(rd());
    static std::uniform_int_distribution<int> dist(0, 25);
    for (int i = 0; i < len; ++i) {
        s[i] = 'a' + dist(mt);
    }
    s[len] = 0;
}

0
//C++ Simple Code
#include <bits/stdc++.h>
using namespace std;
int main() {
vector<char> alphanum =
    {'0','1','2','3','4',
'5','6','7','8','9',
'A','B','C','D','E','F',
'G','H','I','J','K',
'L','M','N','O','P',
'Q','R','S','T','U',
'V','W','X','Y','Z',
'a','b','c','d','e','f',
'g','h','i','j','k',
'l','m','n','o','p',
'q','r','s','t','u',
'v','w','x','y','z'
};
string s="";
int len=5;
srand(time(0)); 
for (int i = 0; i <len; i++) {
    int t=alphanum.size()-1;
    int idx=rand()%t;
    s+= alphanum[idx];
}
cout<<s<<" ";
return 0;
}


-1

เป็นเครื่องเมื่อเรียกใช้ฟังก์ชัน

string gen_random(const int len) {
static const char alphanum[] = "0123456789"
        "ABCDEFGHIJKLMNOPQRSTUVWXYZ";

stringstream ss;

for (int i = 0; i < len; ++i) {
    ss << alphanum[rand() % (sizeof(alphanum) - 1)];
}
return ss.str();
}

(ดัดแปลงจาก@Ates Goral ) มันจะส่งผลให้มีลำดับอักขระเหมือนกันทุกครั้ง ใช้

srand(time(NULL));

ก่อนที่จะเรียกใช้ฟังก์ชันแม้ว่าฟังก์ชัน rand () จะถูกseedด้วย 1 @kjfletchเสมอ

ตัวอย่างเช่น:

void SerialNumberGenerator() {

    srand(time(NULL));
    for (int i = 0; i < 5; i++) {
        cout << gen_random(10) << endl;
    }
}

-1
#include <iostream>
#include <string>
#include <stdlib.h>
int main()
{
    int size;
    std::cout << "Enter size : ";
    std::cin >> size;
    std::string str;
    for (int i = 0; i < size; i++)
    {
        auto d = rand() % 26 + 'a';
        str.push_back(d);
    }
    for (int i = 0; i < size; i++)
    {
        std::cout << str[i] << '\t';
    }

    return 0;
}

-2
void strGetRandomAlphaNum(char *sStr, unsigned int iLen)
{
  char Syms[] = "0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  unsigned int Ind = 0;
  srand(time(NULL) + rand());
  while(Ind < iLen)
  {
    sStr[Ind++] = Syms[rand()%62];
  }
  sStr[iLen] = '\0';
}

ดูเหมือนกับคำตอบที่ติดอันดับยอดนิยม ไม่แน่ใจว่าคำตอบนี้จะเพิ่มคุณค่าใด ๆ
jm

ใช่มันจะ "srand (time (NULL));" ดัชนีจะสุ่มในทุก ๆ การวนซ้ำทำให้สตริงของคุณสุ่มมากขึ้น xD สตริงจะแตกต่างกันทุกครั้งที่เขาเรียกใช้ฟังก์ชัน ... นอกจากนี้อักขระใน Syms แสดงถึง อาร์เรย์เดียวไม่ใช่อาร์เรย์ของตัวชี้ไปยังสตริง
ДеянДобромиров

1
คุณเคยลองไหม srand (time (NULL)) รีเซ็ตตัวสร้างแบบสุ่มให้เหมือนกันทุกรอบดังนั้นมันจะพิมพ์แถวของสัญลักษณ์เดียวกัน
Öö Tiib

ทำงานได้ดีที่นั่นได้รับการแก้ไข :)
พฤหัสบดีที่

มันทำงานบน STM32F4 ของฉัน xD
ДеянДобромиров
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.