質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

Q&A

解決済

2回答

3265閲覧

ランダムな文字列を作りたいのですが

vvvchrome

総合スコア19

Rust

Rustは、MoFoが支援するプログラミング言語。高速性を維持しつつも、メモリ管理を安全に行うことが可能な言語です。同じコンパイル言語であるC言語やC++では困難だったマルチスレッドを実装しやすく、並行性という点においても優れています。

0グッド

0クリップ

投稿2016/12/17 17:45

Rustを勉強中で、a-zからランダムに取り出した文字列を生成したいのですが、分からない点があるため質問します。

rust

1extern crate rand; 2 3use rand::Rng; 4 5fn main(){ 6 let id = rand::thread_rng().gen_ascii_chars().take(8).collect::<String>(); 7 8 println!("{}", id); 9}

これでa-z, A-Z, 0-9からランダムに取り出した8文字の文字列が作れるのは分かったのですが、
数字+大文字抜きのa-zからランダムに取り出したx文字の文字列の場合は、どの様なコードを書くのが最適でしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

簡単な方法は.filter()でa~z以外を消してしまう方法でしょうか。

rust

1extern crate rand; 2use rand::Rng; 3 4fn main(){ 5 const CHARS: &'static [u8] = b"abcdefghijklmnopqrstuvwxyz"; 6 let mut rng = rand::thread_rng(); 7 8 // (1) 9 let id: String = rng.gen_ascii_chars() 10 .filter(|&x| x >= 'a' && x <= 'z') 11 .take(8) 12 .collect(); 13 println!("{}", id); 14 15 // (2) 16 let id: String = (0..8).map(|_| *rng.choose(&CHARS).unwrap() as char) 17 .collect(); 18 println!("{}", id) 19 20 // (3) 21 let id: String = (0..8).map(|_| rng.gen_range(b'a', b'z'+1) as char) 22 .collect(); 23 println!("{}", id); 24}

(1)の方法は手っ取り早いですが、定数時間で終わらないので少しインフォーマルです。
(2)の方法はテーブルを用意しているので大げさな感じがします。
(3)の方法もありかもしれません。b'z'+1しているのはgen_range()が [low, high)だからです。(追記)

AsciiGeneratorの実装もテーブル参照のようです。

投稿2016/12/18 03:07

編集2016/12/18 03:35
sharow

総合スコア1149

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vvvchrome

2016/12/18 03:43

サンプルコード付きの回答ありがとうございます。 テーブルを用意せずgen_ascii_charsを上手く利用したいと考えていたのですが、それもテーブル参照であるなら(3)で実装してみます。 理解しやすい回答に感謝!
guest

0

Rustについて知りたいときは、まず最初にRustのマニュアルを調べましょう。Rustのことなら、たいていここに書いてあります。

get_ascii_charsの説明には、

Return an iterator of random characters from the set A-Z,a-z,0-9.

と書いてあるので、これを使うと「a-z, A-Z, 0-9からランダムに取り出したもの」になってしまうのは仕方がないですね。

代わりにchooseを使えば、任意の値の集合からランダムに取り出した文字列を作れると思われます。

投稿2016/12/18 03:26

ikedas

総合スコア4315

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vvvchrome

2016/12/18 03:47

回答ありがとうございます。 分からない点があれば、ざっとドキュメントを読むのですが、次回からはドキュメントをしっかりと読んでから質問致しますね! chooseを試させていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問