8.1 疑似乱数
時々、プログラマーは一見簡単そうなタスクに直面します。「特定のリストからランダムに映画を選ぶ」、「宝くじの勝者を選ぶ」、「スマホを振って曲のリストをシャッフルする」、「メッセージを暗号化するためのランダムな数字を選ぶ」、そんなときにいつも疑問が生じます:どうやってそのランダムな数字を得るの?
本当に「本物の乱数」が必要な場合、それを得るのはかなり難しいです。それどころか、コンピュータには特別な数学的コプロセッサが組み込まれていて、すべての「真のランダム性」の要件を満たすように数を生成します。
だから、プログラマーは自分たちの解決策を考え出しました - 疑似乱数です。疑似乱数とは、一見するとランダムに見える一連の数字ですが、専門家が詳細に分析すると特定のパターンが見つかります。秘密文書の暗号化には適していませんが、ゲームでサイコロを振ったりする場合には十分です。
たくさんの疑似乱数列生成アルゴリズムがあり、ほとんどすべてのものは前の数といくつかの補助数に基づいて次の乱数を生成します。
例えば、このプログラムは画面に1000個のユニークな数字を出力します:
let a = 41;
let c = 11119;
let m = 11113;
let seed = 1;
function getNextRandom() {
seed = (a * seed + c) % m;
return seed;
}
for (let t = 0; t < 1000; t++) {
let x = getNextRandom();
console.log(x);
}
ちなみに、私たちは疑似乱数について話しているのではなく、まさにそのような数のシーケンスについて話しています。なぜなら、1つの数を見ても、それがランダムであるかどうかを理解することはできません。
ランダムな数はさまざまな方法で得ることができます:
function getNextRandom() {
return 4; # これは間違いなくランダムな数(サイコロを振って出しました)
}
8.2 switch文
switch文は、式の値に基づいて複数のコードブロックの1つを実行するために使われます。特に、1つの値を複数の可能なパターンと比較する必要がある場合に便利です。
構文:
switch(expression) {
case value1:
// expression === value1 の場合に実行されるコード
break;
case value2:
// expression === value2 の場合に実行されるコード
break;
// ...
default:
// どの値も一致しない場合に実行されるコード
}
例:
let day = 3;
let dayName;
switch (day) {
case 1:
dayName = "月曜日";
break;
case 2:
dayName = "火曜日";
break;
case 3:
dayName = "水曜日";
break;
case 4:
dayName = "木曜日";
break;
case 5:
dayName = "金曜日";
break;
case 6:
dayName = "土曜日";
break;
case 7:
dayName = "日曜日";
break;
default:
dayName = "無効な日";
}
console.log(dayName); // "水曜日"
8.3 演算子 ??
??演算子、またはnullish coalescing operatorは、左のオペランドがnullまたはundefinedである場合にデフォルト値を割り当てるために使われます。他の偽の値、例えば0、false、または空文字列("")に対してデフォルト値の適用を避けることができます。
構文:
let result = value1 ?? value2;
value1がnullまたはundefinedでない場合、resultはvalue1になります。そうでない場合、resultはvalue2になります。
例:
let foo = null ?? 'default';
console.log(foo); // 'default'
let bar = 0 ?? 'default';
console.log(bar); // 0 (0はnullまたはundefinedではありません)
let baz = undefined ?? 'default';
console.log(baz); // 'default'
論理OR (||) との違い
||演算子もデフォルト値を設定するために使えますが、これは偽の値、例えば0、""、またはNaNに対して右のオペランドを返します。
比較例:
let value = 0 || 'default';
console.log(value); // 'default' (0は偽の値です)
let value2 = 0 ?? 'default';
console.log(value2); // 0 (0はnullまたはundefinedではありません)
応用
??演算子は、nullまたはundefinedのみにデフォルト値を設定し、0や""などの偽の値を保持する必要がある状況で便利です。
実際の使用例
例1. オブジェクトの設定値のデフォルト:
function configure(settings) {
settings = settings ?? {};
let timeout = settings.timeout ?? 1000;
let color = settings.color ?? 'blue';
// その他の設定ロジック
}
例2. 関数のデフォルトパラメータ:
function printMessage(message) {
message = message ?? 'No message provided';
console.log(message);
}
printMessage(null); // 'No message provided'
printMessage('Hello'); // 'Hello'
??演算子を使用すると、nullまたはundefinedの不足のみを考慮する状況で、よりクリーンで予測可能なコードを書くことができます。
GO TO FULL VERSION