🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

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

Q&A

解決済

2回答

1392閲覧

[GAS][JS]乱数配列の先頭の一致を避けたい

saider_san

総合スコア14

Google Apps Script

Google Apps ScriptはGoogleの製品と第三者のサービスでタスクを自動化するためのJavaScriptのクラウドのスクリプト言語です。

JavaScript

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

0グッド

0クリップ

投稿2021/03/14 08:09

編集2021/03/15 03:13

何をしているか

ランダムで担当者を決めることができる抽選機能をGASで実装中

困っていること

重複のない乱数配列を作成することには成功したが
先頭が一致してしまうことがあり、それをどうにか避けたい

どういうことか

現状のコード
(こちらを参考にさせていただきました。参考URL:https://pisuke-code.com/js-create-non-overlap-randoms/)

// 重複チェック用配列 var randoms = []; // 最小値と最大値 var min = 1, max = 6; // min以上max以下の整数値の乱数を返す function intRandom(min, max){ return Math.floor(Math.random() * (max - min + 1)) + min; } // 重複チェックしながら乱数作成 for(i = min; i <= max; i++){ while(true){ var tmp = intRandom(min, max); if(!randoms.includes(tmp)){ randoms.push(tmp); break; } } } //抽選には乱数配列の先頭だけを扱う // この数字を元にspreadsheetの担当者を割り出すため var row = randoms[0] ... .. // 以下に担当者割り振りのロジックが続いていく...

console.log(randoms);とし、
何度か実行すると以下のようにランダムな配列が作成できることが確認できます。

1回目... [1.0, 2.0, 5.0, 6.0, 4.0, 3.0] 2回目... [6.0, 1.0, 3.0, 6.0, 5.0, 2.0]

randoms[0]が連続で実行すると前後で一致してしまう場合がある・・・

例えば以下のようになります。

1回目... [1.0, 2.0, 5.0, 6.0, 4.0, 3.0] 2回目... [1.0, 6.0, 3.0, 4.0, 5.0, 2.0]

知りたいこと

ランダムな乱数配列はできたものの、実際に取りたい値はrandoms[0]のため
連続実行時に1.0~6.0の数字をランダムで出したいのですが先頭が一致してしまっていると意味がない・・・
GASを使用して前回実行したデータと現在の実行データの値が一致しているかの判定を取る必要があるかと思うのですが
それらの方法が分からず、
どのように実装すれば良いかが手が動かず、こちらに投稿させていただきました。

アドバイスなどご教示いただけますと幸いです。

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

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

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

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

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

maisumakun

2021/03/14 08:12

「何度か実行」というのは、どのように行っていますか?
saider_san

2021/03/14 08:16

コメントありがとうございます! GAS(google app script)のトリガー(実際に活用する際はトリガーを作成して実行していく予定です)や、 GASがコンソール画面でそのまま関数など実行できるのでそこで実行しています!
sawa

2021/03/15 00:19

担当割の偏りって意味では、前後で一致しない場合でも例えば randoms[0]が 5,1,5,3,5,4 みたいなケースもありえるわけで。そうすると5番の人は不公平感があります。 その辺りの定義をしっかり固めるか、面倒なら乱数配列の順番に担当を割り当てて、1周したら再度乱数配列取得ってするのでも良いのでは。
guest

回答2

0

自己解決

質問方法が煩雑だったので、内容整理して改めて投稿し直します!

投稿2021/03/15 06:33

saider_san

総合スコア14

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

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

0

複数回実行して結果を次に影響させようとすれば、結果を「どこか」に記録するしかありません。

Google Apps Scriptの場合、Propertiesのような場所があります。

投稿2021/03/14 08:28

maisumakun

総合スコア145967

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

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

maisumakun

2021/03/14 08:29

「ランダムである」ということは、「同じ値が連続して出ることもありうる」ということです。 純粋にランダムにするのではなくどのような性質が求められるのか、もう少し具体的に書いていただければと思います。
saider_san

2021/03/14 23:43

コメントありがとうございます! >純粋にランダムにするのではなくどのような性質が求められるのか、もう少し具体的に書いていただければと思います。 確かに、この場合は前後の値をどこかで保持して、それを次の実行タイミングで比較するというのが、自分が本質的にやりたいこと、ですね! 質問文面も修正しようと思います。 Propertiesというものをそもそも知らなかったので、試しに以下のように実装してみたのですが 値は変わらず、うまく効かないようでした・・・ (Propertiesに保存した値と、元々のrandomsの値をlogでみています) ``` /** 重複チェック用配列 */ var randoms = []; /** 最小値と最大値 */ var min = 1, max = 6; /** min以上max以下の整数値の乱数を返す */ function intRandom(min, max){ return Math.floor(Math.random() * (max - min + 1)) + min; } function TANTOU() { /** 重複チェックしながら乱数作成 */ for(i = min; i <= max; i++){ while(true){ var tmp = intRandom(min, max); if(!randoms.includes(tmp)){ randoms.push(tmp); break; } } } //追加 スクリプトプロパティに保存する var prop = PropertiesService.getScriptProperties(); prop.setProperty("value", randoms[0]); //追加 スクリプトプロパティの値を取得 var prop = PropertiesService.getScriptProperties(); var res = prop.getProperty("value"); Logger.log('~~~~~~~res'); Logger.log(res); Logger.log('~~~~~~~randoms[0]'); Logger.log(randoms[0]); ... .. // 以下に担当者割り振りのロジックが続いていく... ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問