【概要】
「ここからここまでの値の中からテキトーに素数を探したいなー」 と思った時に、使えるものがあったらいいなー。という思いから作ってみました。
【コード】
JSファイルの一部を公開します。
function search() {
// 変数の取得:中略
// 変数の補正:中略
b = Math.ceil( fix( B , 10 , Bmax ) );
a = Math.floor( fix( A , b - 1 , Amax ) );
n = fix( N , 1 , Nmax );
// エラトステネスの篩
isP = new Array( b + 1 );
for ( i = 0 ; i <= b ; i ++ ) {
isP[ i ] = true;
}
isP[ 0 ] = false;
isP[ 1 ] = false;
function check( i ) {
if ( isP[ i ] ) {
for ( k = i * i ; k <= b ; k += i ) {
isP[ k ] = false;
}
if ( ( A <= i ) && ( i <= B ) ) {
Prime.push( i );
}
}
}
// A以上B以下の素数を記録する配列を作成する
Prime = new Array( 0 );
check( 2 );
check( 3 );
i = 1;
while ( true ) {
if ( 6 * i - 1 <= b ) {
check( 6 * i - 1 );
}
else {
break;
}
if ( 6 * i + 1 <= b ) {
check( 6 * i + 1 );
}
else {
break;
}
i ++;
}
// 答えを出力する
Save = new Array( 0 );
Ans = `A = ${ A } , B = ${ B }<br>N = ${ n }<br>`;
if ( Prime.length <= N ) {
if ( Prime.length < N ) {
Ans += `${ Prime.length }個しか見つけられなかったよ<br>`;
}
Save = Prime.slice();
}
else {
while ( Save.length < n ) {
r = Math.floor( Math.random() * Prime.length );
s = Prime.splice( r , 1 );
Save.push( s[ 0 ] );
}
Save.sort( ( a , b ) => a - b );
}
for ( i = 0 ; i < Save.length ; i ++ ) {
Ans += `${ Save[ i ] }<br>`;
}
document.getElementById( "result" ).innerHTML = Ans;
return;
}
【コード構造】
1. 変数A、B、Nを取得する
2. 変数の補正
3. 上限Bでエラトステネスの篩
4. 篩にかけると同時に、A以上B以下の素数を記録する配列Primeを作成する
5. 配列PrimeからランダムにN個だけ要素を取り出し、答えを昇順に出力する
今回素数を探す範囲は、A以上B以下。その中からN個だけ素数をランダムに出力します。
ここでNは自然数。表示枠の見やすさの問題がありそうなので、今回はNの上限を100に定めています。
Nの値が 「A以上B以下に存在する素数の数」 よりも大きければ、出力結果は毎回変化します。
【使用例】
【現時点で思いつく改善点】
・入力枠が小さい
ボックスにカーソルを合わせるだけで大変です。特に縦に小さいのが気になります。
・A、Bの入力枠とNの入力枠が同じサイズ
Nは高々3桁にしかならないので、同じサイズだとちょっと使いづらいかも。Nの入力フォームはもっと小さくていいような気がしています。
・殺風景
動作が重くならないように、装飾は最低限にしようと思っています。しかしそれにしたって、白背景に黒字だけで味気ない。色を付けたり枠を付けたり、シンプルでも見やすくする方法はあるはず。
【今後勉強したいこと】
・HTML、CSSの勉強
Webページを見やすいものにするため、Webデザインと機能はある程度身に付けておきたいですね。
・Node.jsなど
ここまでの制作物は、すべてJSと素数で遊んできただけ。簡単なゲームくらいはそろそろ作れるようになっているかも。
やることリストなども作ってみたい。以前Node.jsを使ったやることリスト作成を試したことがありますが、途中で断念しています。再挑戦してみたい。



