Saya ingin membuat string acak, yang terdiri dari karakter alfa-numerik. Saya ingin bisa menentukan panjang string.
Bagaimana saya melakukan ini di C ++?
Jawaban Mehrdad Afshari akan melakukan trik, tetapi saya merasa agak terlalu verbose untuk tugas sederhana ini. Tabel pencarian terkadang dapat melakukan keajaiban:
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;
}
s[len] = 0
salah. Jikas
adalah string C (NULL dihentikan) maka tanda tangan metode tidak harus memilikilen
parameter di dalamnya. Imo, jika Anda melewatkan panjang sebagai argumen, Anda menganggap array bukan string C. Dengan demikian, jika Anda tidak meneruskan string C ke fungsi, baris tersebuts[len] = 0
dapat memecah hal-hal, karena array akan berubah dari 0 menjadi len-1. Dan bahkan jika Anda melewatkan string C ke fungsi, gariss[len] = 0
akan menjadi berlebihan.Inilah adaptasi saya atas jawaban Ates Goral menggunakan C ++ 11. Saya telah menambahkan lambda di sini, tetapi prinsipnya adalah Anda bisa meneruskannya dan dengan demikian mengontrol karakter apa yang terkandung dalam string Anda:
Berikut ini adalah contoh meneruskan lambda ke fungsi string acak: http://ideone.com/Ya8EKf
Mengapa Anda menggunakan C ++ 11 ?
Sebagai contoh:
Output sampel.
sumber
rand()
potongan kode pertama Anda?rand()
lagi. Itu bahkan tidak seragam untuk menangis dengan suara keras ...Solusi 2p saya:
sumber
default_random_engine
bukanmt19937
? Kode akan terlihat lebih umum.std::default_random_engine
bukanlah sesuatu yang saya rasa bagus untuk merekomendasikan karena standar tidak menjamin kualitas, efisiensi atau pengulangan antara implementasi.sizeof
, ubahauto&
tostd::string
, yang memberi Andastd::string::length
std::string
cenderung lambat karena berisi pointer internal ke datanya. Itu berarti tipuan ekstra yang tidak diperlukan array statis. Jugasizeof
tidak pernah bisa lebih lambat daripadastd::string::size
karena itu adalah waktu kompilasi yang konstan.std::size
tidak muncul sampaiC++17
dan masih ada banyak orang yang hanya codingC++11/14
sehingga saya akan membiarkannya seperti sekarang.sumber
Saya baru saja menguji ini, ini bekerja dengan baik dan tidak memerlukan tabel pencarian. rand_alnum () semacam memaksa keluar alfanumerik tetapi karena memilih 62 dari kemungkinan 256 karakter, itu bukan masalah besar.
sumber
Daripada melakukan perulangan secara manual, lebih baik menggunakan algoritma C ++ yang sesuai , dalam hal ini
std::generate_n
, dengan penghasil angka acak yang tepat :Ini dekat dengan sesuatu yang saya sebut solusi "kanonik" untuk masalah ini.
Sayangnya, menabur dengan benar generator generik acak C ++ generik (mis. MT19937) benar-benar sulit . Oleh karena itu kode di atas menggunakan fungsi template helper,
random_generator
:Ini rumit dan relatif tidak efisien. Untungnya ini digunakan untuk menginisialisasi a
thread_local
variabel dan oleh karena itu hanya dipanggil sekali per utas.Akhirnya, yang perlu mencakup untuk di atas adalah:
Kode di atas menggunakan deduksi argumen templat kelas dan karenanya membutuhkan C ++ 17. Ini dapat diadaptasi sepele untuk versi sebelumnya dengan menambahkan argumen templat yang diperlukan.
sumber
std::size_t
untuk menyimpulkanstd::uniform_int_distribution
? Saya tidak dapat melihat CTAD lainnyarng
sebagai parameter default, dengan sesuatu sepertitemplate <typename T = std::mt19937> inline thread_local T default_rng = get_random_generator<T>();
std::uniform_int_distribution<>
, yang akan aman, tetapi mungkin memperingatkan tentang konversi yang ditandatangani -> tidak ditandatangani.Saya harap ini membantu seseorang.
Diuji di https://www.codechef.com/ide dengan C ++ 4.9.2
Output: random_str : DNAT1LAmbJYO0GvVo4LGqYpNcyK3eZ6t0IN3dYpHtRfwheSYipoZOf04gK7OwFIwXg2BHsSBMB84rceaTTCtBC0uZ8JWPdVxKXBd
sumber
RandomString(100)
! ;-)std::srand()
hanya benar-benar dipanggil sekali pada awal program (lebih disukai hal pertama dalammain()
). Kode ini, seperti apa adanya, akan menghasilkan banyak string "acak" yang identik jika dipanggil dalam loop yang ketat.Ini satu kalimat yang lucu. Membutuhkan ASCII.
sumber
sumber
std::string
bukannyastd::string::value_type[]
Sesuatu yang lebih sederhana dan lebih mendasar jika Anda senang string Anda mengandung karakter yang dapat dicetak:
sumber
String acak, setiap file run = string berbeda
sumber
std::generate_n
akan menganggapcustom_string
memiliki panjangLENGTH_NAME
, tetapi tidak.Contoh untuk penggunaan Qt :)
sumber
Mari kita buat kenyamanan acak lagi!
Saya membuat solusi bagus C ++ 11 header saja. Anda dapat dengan mudah menambahkan satu file header ke proyek Anda dan kemudian menambahkan tes Anda atau menggunakan string acak untuk tujuan lain.
Itu deskripsi singkat, tetapi Anda dapat mengikuti tautan untuk memeriksa kode lengkap. Bagian utama dari solusi adalah di kelas Randomer:
Randomer
melumpuhkan semua hal acak dan Anda dapat menambahkan fungsionalitas Anda sendiri dengan mudah. Setelah kita milikiRandomer
, sangat mudah untuk menghasilkan string:Tulis saran Anda untuk peningkatan di bawah ini. https://gist.github.com/VjGusev/e6da2cb4d4b0b531c1d009cd1f8904ad
sumber
Namun adaptasi lain karena tidak ada jawaban akan mencukupi kebutuhan saya. Pertama-tama jika rand () digunakan untuk menghasilkan angka acak, Anda akan mendapatkan output yang sama di setiap proses. Benih untuk pembangkit bilangan acak harus berupa acak. Dengan C ++ 11 Anda dapat memasukkan pustaka "acak" dan Anda dapat menginisialisasi benih dengan random_device dan mt19937. Benih ini akan disediakan oleh OS dan itu akan cukup acak bagi kami (misalnya: jam). Anda dapat memberikan batasan batas yang disertakan [0,25] dalam kasus saya. Dan yang tak kalah pentingnya, saya hanya membutuhkan string acak huruf kecil jadi saya menggunakan tambahan char. Dengan kumpulan karakter pendekatan tidak berhasil untuk saya.
sumber
sumber
Jadilah ware saat memanggil fungsi
(diadaptasi dari @Ates Goral ) itu akan menghasilkan urutan karakter yang sama setiap kali. Menggunakan
sebelum memanggil fungsi, meskipun fungsi rand () selalu diunggulkan dengan 1 @kjfletch .
Sebagai contoh:
sumber
sumber
sumber