「ランダムグラブバッグ」と呼ばれるものが必要です。あなたは「バッグ」の数字を持っていると考えてください。それぞれの数字はこのバッグに一度しか表されていません。あなたは、あなたが必要とする数だけランダムに数字を取り出します。
他の解決策の問題点は、数字をランダムに生成し、すでに使用されているかどうかを確認することです。 random()関数があなたがまだ持っていない値を返すのを待っているので(理論的には無限の時間まで)これを完了するのにもっと時間がかかります(にはがありません1〜9を永遠に与えることができますが、10を返すことはありません)。
グラブバッグタイプのソリューションを実装する方法はたくさんありますが、それぞれのコストはさまざまです(ただし、正しく行われていれば無限ではありません)。あなたの問題へ
最も基本的なソリューションは、次のようになります。
var grabBag = [1,2,3,4,5,6,7,8,9,10];
// randomize order of elements with a sort function that randomly returns -1/0/1
grabBag.sort(function(xx,yy){ return Math.floor(Math.random() * 3) - 1; })
function getNextRandom(){
return grabBag.shift();
};
var originalLength = grabBag.length;
for(var i = 0; i < originalLength .length; i++){
console.log(getNextRandom());
}
これはもちろん、オリジナルgrabBagアレイへの破壊的です。そのような並べ替えが本当にランダムであるかどうかはわかりませんが、多くのアプリケーションでは「十分に良い」ことができます。
未使用の要素をすべて配列に格納し、インデックスをランダムに選択し、そのインデックスの要素を削除するというアプローチが少し異なります。ここでのコストは、要素を削除するたびに配列を作成/破棄する頻度です。
これらのステップのうち、どの手順に問題がありますか? –
あなたはすでに何をすべきかを知っています。あなたがする必要があるのは、試してみるだけです。そして、何らかの形でそれがあなたのコードを投稿して、人々があなたを見て助けてくれるのであれば、 –