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

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

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

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

2回答

1709閲覧

c# 文字数を決めるコード(乱数に近いかな?)の続き

come25136

総合スコア258

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

0クリップ

投稿2015/06/12 13:18

編集2015/06/12 13:31

前回の質問
動作確認をした所

lang

1~省略~ 2int pos = r.Next(randomInput.Length); 3 char c = randomInput[pos]; 4 //↓文字重複させたくない場合 5 //if (sb.ToString().IndexOf(c) >= 0) continue; 6 sb.Append(c); 7~省略~

の"//if (sb.ToString().IndexOf(c) >= 0) continue;"を有効にすると何故か応答なしになります
解決方法を教えて下さい(_ _)

※追記

lang

1private static readonly string randomInput = "10101010101010101"; //本当は文字ですが都合上数字に変えています(元の例:あいあいあいあい...←こんな感じです) 2 static string GetHoge() 3 { 4 StringBuilder sb = new StringBuilder(); 5 Random r = new Random(); 6 //↓文字数固定であればこれを固定値にする 7 int length = r.Next(5, 17); //◯~◯文字 8 while (sb.Length <= length) 9 { 10 int pos = r.Next(randomInput.Length); 11 char c = randomInput[pos]; 12 //↓文字重複させたくない場合 13 if (sb.ToString().IndexOf(c) >= 0)continue; 14 sb.Append(c); 15 } 16 return sb.ToString(); 17 }

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

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

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

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

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

Tak1wa

2015/06/12 13:26

既にコメントアウトされてる行ですが、有効行に変更したという意味でしょうか?いずれかの理由で無限ループしていますね。 「randomInput」の内容と、前の質問の「int length = r.Next(3, 5); 」の部分が現在どういう実装になっているか教えてください。
come25136

2015/06/12 13:27

すみません、そうです有効にしたのです
Tak1wa

2015/06/12 13:34

あー、すみません。無限ループになり得ますねこれは…。 修正するのでお待ちを。
guest

回答2

0

ベストアンサー

文字数だけであれば、以下だけでいいことになります。

lang

1static string GetHoge() 2{ 3 Random r = new Random(); 4 int length = r.Next(5, 18); 5 return randomInput.Substring(0, length); 6}

#ちなみにNextメソッドの第二引数は最大桁数-1が正しかったです。
#上の例では5~17までがランダムで取得されます。

投稿2015/06/12 14:15

Tak1wa

総合スコア4791

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

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

come25136

2015/06/12 14:19

ありがとうございます!! 無事解決しました 今回は多分ですが・・・"乱数"と言う言葉を使ったことにより解釈を間違ったのだと思います 次からは最初からわかりやすく質問しますのでこれからもよろしくお願いします(_ _)
guest

0

こんにちは。

ガラリと変わりますが以下のように変更しました。
重複してなくて良いとのことなので、文字列をランダムソートし、ランダムな長さだけ先頭から切り出しました。

lang

1static string GetHoge() 2{ 3 StringBuilder sb = new StringBuilder(); 4 Random r = new Random(); 5 int length = r.Next(5, 17); //◯~◯文字 6 var shuffle = randomInput.OrderBy(x => Guid.NewGuid()).ToArray(); 7 for (int i = 0; i < length; i++) 8 { 9 sb.Append(shuffle[i]); 10 } 11 return sb.ToString(); 12}

投稿2015/06/12 13:41

編集2015/06/12 13:56
Tak1wa

総合スコア4791

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

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

come25136

2015/06/12 13:51

うーんやはり無限ループになってしまいます (コメントアウトを有効にした時だけ)
Tak1wa

2015/06/12 13:55

このロジックのコメント部分は全て削除して良いです。以前のロジックは重複した文字があれば再度ループして乱数から文字列を取得していました。 しかし「あいあいあいあいあい」の場合は重複を考慮してしまうと2文字までにしかなりません。 今回のロジックは重複かどうかに関係なく、最初に与えられた文字をソートしますのでその問題は解決されています。 GetHogeメソッドの中を入れ替えてみてください。 コメント行は削除しておきます。
come25136

2015/06/12 14:03

再度試しましたが今度は"11100101111100010"みたいになってしまいます 夜遅くまですみません(_ _) (理想:10101010101010101から10101010←文字数だけランダムで変えれればいい)
Tak1wa

2015/06/12 14:05

すみません。そもそもの質問を解釈違っていたかもしれません。 最初に与えられた文字列自体はランダム化しなくても良かったのですね。 上記の場合だと開始位置は先頭からですか?ランダムですか?
come25136

2015/06/12 14:07

先頭からです(_ _)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問