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

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

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

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

Q&A

解決済

3回答

1936閲覧

ランダムなアルファベットを生成する仕組みを教えていただけないでしょうか。

taka_oct092018

総合スコア136

JavaScript

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

0グッド

0クリップ

投稿2021/09/14 07:22

// ランダムなアルファベットの文字列を表示するプログラム //「徹底マスターJavaScriptの教科書 P204」からの引用です。 let randomChars =""; for(let i=0; i<8; i++) { randomChars += String.fromCharCode(Math.floor(Math.random()*26) + "a".charCodeAt(0)); } console.log(randomChars);

console.log("a".charCodeAt(0)); 「97 文字列"a"の0番目のUTF-16符号の10進表記 つまり"a"の文字コード。」
console.log((Math.floor(Math.random()*26))); 「0~25の数値をランダムに生成している」

どうして、0~25までのランダムな数値に文字列"a"の文字コードを加算した値を引数として、
fromCharCode()に渡すとランダムなアルファベットが生成されるのでしょうか?
UTF-16における符号化文字集合と文字符号化方式」の仕組みがよく分かりません。
なんとなくですが、アルファベットの最初の文字であるaの文字コードを取得して0から25までのいずれかの数値を加算しておけば、
26文字あるアルファベットのどれかの文字コードに該当すると、イメージしています。
よろしくお願い致します。

学習したサイト
https://www.javadrive.jp/javascript/string/index13.html
https://wa3.i-3-i.info/word15294.html

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

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

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

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

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

guest

回答3

0

ベストアンサー

どうして、0~25までのランダムな数値に文字列"a"の文字コードを加算した値を引数として、

fromCharCode()に渡すとランダムなアルファベットが生成されるのでしょうか?

どの文字がどの文字コードに位置するのかを整理しましょう。

wikipedia で16進表記の一覧が記載されています。
a は 0060 の行の 1 の列にあります。つまり16進表記で 0061 = 61 です。10進数では 97 です。
以後、16進数は接頭辞 0x をつけて 0x61 と表記します。

同じように一覧を見ていくと b は 0x62(98) であり、 c は 0x63(99) であり、z … 0x7A(122) まで連番になっていると分かります。

Math.floor(Math.random()*26) + "a".charCodeAt(0) は 0x61(97) から 0x7A(122) までの値をランダムで生成しているにすぎません。

例えば、もしランダムな数値が 0x0D(13) なら a の文字コード 0x61(97) と足して 0x6E(110) が求まります。一覧を見ると 0x6E(110) は n であると分かります。そして String.fromCharCode(110) の戻り値が n であると確認できます。

他のアルファベットにおいても確認方法は同じです。

投稿2021/09/14 08:01

編集2021/09/14 08:23
BluOxy

総合スコア2663

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

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

BluOxy

2021/09/14 08:08

余談ですが、文字コードを直接参照しない方法もあります。 randomChars += "abcdefghijklmnopqrstuvwxyz".charAt(Math.floor(Math.random()*26));
taka_oct092018

2021/09/15 12:53

BluOxy様 詳細かつ具体的な解説ありがとうございます。 とても良く分かりました。
guest

0

以下のように順番に並んでいるのを見ると分かりやすいのではないでしょうか。

イメージ説明

String.fromCharCode(Math.floor(Math.random()*26) + "a".charCodeAt(0));

"a".charCodeAt(0) で文字 a の UTF-16 コードを表す整数 0x0061 (10 進数で 97) を取得し、それに 0 ~ 25 の範囲のランダムな数字を足して、String.fromCharCode メソッドで足した数字の文字列を取得して戻り値として返しています。

投稿2021/09/14 08:18

編集2021/09/14 08:20
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

taka_oct092018

2021/09/15 12:55

SurferOnWww様 具体的にコード表を掲載して下さってありがとうございます。 とても分かり易いです。
guest

0

文字コードが、aから順番にzまで並んでいるからです。
aの文字コードに+1すると、bの文字コードになり、+2するとcの文字コードとなります

まあ、当然のことながら、a~zまで順番に並んでいない文字コードを使っているときは、このプログラムではおかしくなりますね

投稿2021/09/14 07:26

編集2021/09/14 07:28
y_waiwai

総合スコア88042

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

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

maisumakun

2021/09/14 07:40

JavaScriptは言語レベルでUTF-16に決め打ちなので、「a~zまで順番に並んでいない文字コード」で実行される心配はありません。
taka_oct092018

2021/09/15 12:50

y_waiwai様 返信ありがとうございます。 自分の予想が当たっていて安心しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問