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

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

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

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

Q&A

解決済

3回答

1714閲覧

javascriptで、n桁の整数を乱数で取得したい。

suga_prog

総合スコア1

JavaScript

JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

0グッド

0クリップ

投稿2020/09/13 14:32

前提・実現したいこと

javascriptで n桁の整数を乱数で取得したい。

発生している問題・エラーメッセージ

例えば、2桁の整数の乱数を作ろうとしたとき、下記のコードだと、1桁の整数が混じってきます。
何が原因で、どう解決したら良いのかがわかりません。

該当のソースコード

javascript

1let num1 = 2 //<=2桁の整数で乱数を作りたい 2 3let rand1 = Math.floor( Math.random() * (10 ** num1) - (10 ** (num1 - 1))) + (10 ** (num1 - 1)); 4 5console.log(rand1)

解決策をお持ちの方、ご教授ください。
また、上記コードよりももっとシンプルな記述があったら、そちらもぜひ知りたいです。
よろしくお願いします。

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

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

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

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

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

guest

回答3

0

こんにちは

ご質問に

シンプルな記述があったら、そちらもぜひ知りたいです。

とありましたので、ライブラリにお任せする案を回答します。lodash の _.random を使います。

javascript

1// ランダムな n 桁の整数を取得する関数 2const randN = (n = 1) => _.random(n === 1 ? 0 : 10**(n-1), 10**n - 1);

投稿2020/09/13 16:50

編集2020/09/13 17:33
jun68ykt

総合スコア9058

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

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

suga_prog

2020/09/13 21:25 編集

回答ありがとうございます。 ライブラリを使うと、こんなに短い記述になるんですね!感動しました! 動作確認用サンプルもつけていただき、とても分かりやすかったです。 ありがとうございました。
guest

0

ベストアンサー

何が原因で、どう解決したら良いのかがわかりません。

JavaScript

1let rand1 = Math.floor( Math.random() * (10 ** num1) - (10 ** (num1 - 1))) + (10 ** (num1 - 1));

これの形を変えると次のようになります。マイナスしている部分はカッコから出しても同じなので出します。

JavaScript

1let rand1 = Math.floor( Math.random() * (10 ** num1)) 2 - (10 ** (num1 - 1)) 3 + (10 ** (num1 - 1));

後半が打ち消しあってますね。これが原因で、0 以上 10 ** num1 未満の乱数が出ています。次に対策ですが、
1 桁の数は 1 から 9 の 9 個に 0 を含め 10 個
2 桁の数は 10 から 99 の 90 個
3 桁の数は 100 から 999 の 900 個

つまり、1 桁の数は特別ですが、その他の数は 10 ** (num1 - 1) * 9 個あるわけです。
この数を Math.random() にかけましょう。そして最後にゲタをはかせます。

JavaScript

1let rand1 = Math.floor(Math.random() * (10 ** (num1 - 1) * 9)) + 10 ** (num1 - 1);

一桁の数だけは別に計算してください。

JavaScript

1let rand1 = Math.floor(Math.random() * 10);

これらを合わせると以下のようになります。三項条件演算子を使わず式を立てることもできますが、無理なことをするよりもこの方が可読性が高いでしょう。なお、以下の式は、num1 が 1 未満であった場合、1 であるとみなしたものになります。

JavaScript

1let rand1 = num1 > 1 2 ? Math.floor(Math.random() * (10 ** (num1 - 1) * 9)) + 10 ** (num1 - 1) 3 : Math.floor(Math.random() * 10);

投稿2020/09/13 14:55

編集2020/09/13 15:40
Zuishin

総合スコア28662

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

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

suga_prog

2020/09/13 21:21

原因と対策を細かく解説していただき、ありがとうございました。 今の私にとって、一番分かりやすかったので、ベストアンサーにさせていただきます。
guest

0

最低数値を計算式にいれればいけるかと。

javascript

1const num1 = 2; 2const min = 10; 3const max = min ** num1; 4 5const rand1 = Math.floor( Math.random() * (max - min) ) + min; 6 7console.log(rand1);

投稿2020/09/13 15:02

miyabi_takatsuk

総合スコア9528

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

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

suga_prog

2020/09/13 21:31

回答ありがとうございます。 自分のコードに採用してうまく動くか、今夜試してみて、改めてコメントします。
suga_prog

2020/09/14 10:19

試してみたら、うまくいきました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問