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

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

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

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

3回答

2292閲覧

”条件を満たさなければ繰り返すソースコード” Java

java_0527

総合スコア4

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/05/27 05:44

編集2020/05/28 03:41

#条件を満たさなければ繰り返すソースコード Java
”数字、英語大文字、英語小文字をそれぞれ最低1文字含ませた8ケタのパスワードを生成するプログラム”を作りたいのですが、~~で囲まれている範囲を”数字、英語大文字、英語小文字をそれぞれ最低1文字含んでいなければパスワードを再作成する”ようにしたいです。

import java.util.Random;

public class RandomSample {

public static void main(String[] args) {

int length = 8;
boolean useSign = false;
String style = "normal";

StringBuilder result = new StringBuilder();

StringBuilder source = new StringBuilder();

for (int i = 0x30; i < 0x3A; i++) {
source.append((char) i);
}

if (useSign) {
for (int i = 0x21; i < 0x30; i++) {
source.append((char) i);
}
}

switch (style) {
case "lowerCase":
break;
default:
for (int i = 0x41; i < 0x5b; i++) {
source.append((char) i);
}
break;
}

switch (style) {
case "upperCase":
break;
default:
for (int i = 0x61; i < 0x7b; i++) {
source.append((char) i);
}
break;
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
int sourceLength = source.length();
Random random = new Random();
while (result.length() < length) {
result.append(source.charAt(Math.abs(random.nextInt()) % sourceLength));
}
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
System.out.format("%1$s", result);
}
}

知識不足のため、できるだけ詳しく教えていただけると助かります。よろしくお願いします。

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

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

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

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

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

Q71

2020/05/28 05:29

無限に繰り返す。ただし、条件が整ったら繰り返しを抜ける。 というものなら書けますか?
guest

回答3

0

ベストアンサー

これに何を足せばいいのでしょうか、

楽に済ませたければ、「生成したパスワードをチェックして、条件を満たしていなければ再作成」という方法が考えられます。

または別のプログラムがいいのでしょうか?

再作成という手法が手抜きのように思えるなら、

  • 大文字・小文字・数字を1つずつランダムに選ぶ
  • 大文字・小文字・数字全部の中からランダムに5文字を選ぶ
  • この合計8文字をシャッフル

という手法も考えられます。

投稿2020/05/27 05:57

maisumakun

総合スコア145184

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

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

java_0527

2020/05/27 06:22

「生成したパスワードをチェックして、条件を満たしていなければ再作成」というとどのようなソースコードを追加すればいいのでしょうか?教材等で調べたのですが、方法が分かりません。知識不足で申し訳ありません。
swordone

2020/05/29 05:30 編集

ちなみに、文字列のランダム生成1回ごとに、条件に合わない(数字、英大文字、英小文字の少なくとも1種類がない)文字列が生成される確率は約26.9%。
ikadzuchi

2020/05/29 13:01

シャッフルする手法について、なんとなく確率が一様な気がしていましたが、よく考えてみるとこれも一様ではないですね。 題意は満たしているものの注意が必要だと思います。
maisumakun

2020/05/29 13:03

> よく考えてみるとこれも一様ではないですね。 どこでずれてきますか?(ちょっと自分では見落としているかもしれないです)
ikadzuchi

2020/05/29 13:15

はっきり論理立てて理由を説明できないのですが、 提案手法では「1つづつランダムに選んだ部分」×「全種からランダムに選んだ部分」の積のパターン数ができますが、ありうるパターンは「全体」-「条件を満たさないもの」であり、何かの積で表せないはずだと思うのです。 単純な例で計算してみます。 [a,b,c,1]からアルファベットと数字を含む4文字を作るとします。 4^4-(1^4+3^4)=174通りあります。 提案手法でできる、重複を含むパターン数は 1*3*4^2*4P4=1152通りあります。 1152は174で割れません。
swordone

2020/05/29 13:18

同じ文字を含む文字列の並びが、全部バラバラの文字列に比べて出やすいのでは?
maisumakun

2020/05/29 13:25

ですね、同じ文字が入ったときのパターンが違ってきてしまいますね。
guest

0

数字、大文字、小文字からなる配列を用意し、そこから一文字を八回選ぶことで作成できます。その中にたとえば数字が一文字も無かった場合、一文字削除し、適当な位置にランダムな数字を一文字加えてください。

低評価するなら理由を書くように。この方法で問題無くできることは確認しています。

投稿2020/05/27 05:54

編集2020/05/29 04:35
Zuishin

総合スコア28660

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

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

Zuishin

2020/05/27 05:59

この方法は結局、思った出力が得られるまでチェックとリトライを繰り返すことになります。
ikadzuchi

2020/05/28 04:58

パターンの出現確率が一様でないのが気にかかりますね。 まあ一様にすることを求められてはいませんが。
Zuishin

2020/05/28 05:06

確かにそれはそうなんですよね。よく考えず書いたので、美しい方法とは言えません。どうせリトライ繰り返すなら最初から作り直す方がいいと思いますが、maisumakun さんの回答がついたのでこのままで。
guest

0

終了条件が単純に

while (result.length() < length)

になっているから、ここに。
表題にある条件を満たすように修正(追加)すればいいです。

あと、単純にappendだと8桁超えちゃうので、9文字以降追加する場合、1文字削ることも必要です。

投稿2020/05/27 05:55

編集2020/05/27 05:56
momon-ga

総合スコア4820

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問