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

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

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

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

4回答

1555閲覧

JavaScriptにて、配列の中の値を抽出する数を複数パターン設定したい

YutaEmoto

総合スコア14

JavaScript

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2019/05/13 14:40

編集2019/05/13 14:52

JavaScriptで、配列の中からランダムに値を抽出し、かつ、抽出する数も3つか4つに設定したいです。

(問題のある記述は、下記の一番下のコードだと考えています。)

下記のようにコードを書いたのですが、「||」は、左側がtrueであれば左側が選択されるとのことで、出力される数が全て3つになってしまいます。

3つか4つのように設定したいのですが、どのように記述すればよいでしょうか。
よろしくお願いいたします。

JavaScript

1//配列からランダムで選択する関数 2function random(array, num) { 3 var a = array; 4 var t = []; 5 var r = []; 6 var l = a.length; 7 var n = num < l ? num : l; 8 while (n-- > 0) { 9 var i = Math.random() * l | 0; 10 r[n] = t[i] || a[i]; 11 --l; 12 t[i] = t[l] || a[l]; 13 } 14 return r; 15} 16 17var user_array = ['1', '2', '3', '4', '5', '6']; 18 19random(user_array, 3 || 4);

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

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

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

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

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

guest

回答4

0

ベストアンサー

こんにちは

以下、ランダム抽出のコードを自作することからは離れる回答になります。配列に対する操作で便利なライブラリ Lodash を利用すると、 目的とする

ランダムに値を抽出し、かつ、抽出する数も3つか4つ

の配列は、 _.sample_.sampleSize を使って以下で得られます。

javascript

1_.sampleSize(user_array, _.sample([3, 4]))

以下は、上記を10回試行してみるサンプルです。

ご自身でランダム抽出のプログラムを書くことは大変よいと思います。そして、ご自身でも書けた上でならば、次は、このような便利なライブラリを使うことを検討してみてもよいかもしれません。

以上参考になれば幸いです。

追記

ご質問に挙げられている function random(array, num) を使えば、

javascript

1random(user_array, 3 || 4);

と書くことで期待していた動作を、以下によって実現できます。

javascript

1random(user_array, random([3,4], 1));

以下は、上記を 10回試行するサンプルです。

上記のコードを実行するときに、まず random([3,4], 1) が、 [3] または [4] という、要素が1個の配列を返します。仮に [3] が返ってきたすると、次に

javascript

1random(user_array, [3]);

を実行しようとします。関数randomの第2引数numは、配列ではなく数値を期待しているので、エラーになりそうですが、期待どおりに動きます。これは以下で確認できるような型変換が暗黙に行われるからです。

$ node > [4] == 4 true > [4] === 4 false > Number([4]) 4 > let x = [4]; undefined > x -- > 0 true > x 3 > x -- > 0 true > x 2 > const ary = [0, 10, 20, 30, 40, 50, 60]; undefined > ary [ 0, 10, 20, 30, 40, 50, 60 ] > ary[[4]] 40 > ary[[4]] = 99 99 > ary [ 0, 10, 20, 30, 99, 50, 60 ] >

投稿2019/05/14 00:36

編集2019/05/14 03:18
jun68ykt

総合スコア9058

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

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

YutaEmoto

2019/05/14 04:36

ありがとうございます!!ライブラリの紹介に加え、とても詳細に記載していただき、ベストアンサーとさせていただきました! numに配列を渡すのは盲点でした。。本当にありがとうございます!!
jun68ykt

2019/05/14 05:42

どういたしまして。解決されたようで、よかったです ????
guest

0

配列をシャッフルしたあと引数のnum1かnum2の個数分を
配列からsliceで抽出します。
3 || 4 は必ず 3 になるので使えないです。

javascript

1// 配列からランダムで選択する関数 2function random(array, num1, num2) { 3 for (var i = array.length - 1; i > 0; i--){ 4 var r = Math.floor(Math.random() * (i + 1)); 5 var tmp = array[i]; 6 array[i] = array[r]; 7 array[r] = tmp; 8 } 9 var num = Math.random() < 0.5 ? num1 : num2; 10 return array.slice(-num); 11} 12var user_array = ['1', '2', '3', '4', '5', '6']; 13var result = random(user_array, 3, 4); 14console.log(result);

投稿2019/05/13 15:59

yasutomi

総合スコア2937

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

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

0

自分だったらこんな感じに

function random(array, num) { //略 } function get_choice_num() { //3か4を返す } var user_array = ['1', '2', '3', '4', '5', '6']; random(user_array, get_choice_num());

投稿2019/05/13 16:50

takasima20

総合スコア7458

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

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

YutaEmoto

2019/05/14 04:39

ありがとうございます! 複数出力する関数を作るというのはとてもシンプルで良いですね! 最近始めたばかりで一つの関数の中で全て完結させようとしてしまっていたので、とても参考になります。
guest

0

例えばこんな。これだけだと重複したものも出るけど。

let nums = [1,2,5,8,9,123,23,15,6]; let loop=3 if(Math.random() >= 0.5){ loop+=1; } for(loopの回数loop){ console.log(nums[Math.floor( Math.random() * nums.length)]); }

投稿2019/05/13 15:06

bcaa

総合スコア170

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問