
No.5ベストアンサー
- 回答日時:
高級言語は配列のランダム機能があったり
するのでみなさんローレベルのランダム化
にはなれていないのでしょうか?
残念ながらみなさんのコーディングには
問題があります。
重複したら、リトライするという方式は
一番してはいけない方法です。
1000個の要素から1000個抜き出すときに、
999番目の要素は約0.1%の確率でしか重複
しない数値がヒットしません。
要素数が増えると加速度的に時間のかかる
プログラムです。
また#4さんのように、適当な回数要素数
の中で入れ替えをするというの、よさそうに
見えますが、初期要素からいれかわらない
可能性が強く、かなり偏りがでるランダム
です。
そもそも3つの要素を抜き出すのであれば
ランダム処理は3回やればじゅうぶんのはずです。
以下の例はざっとかいたものなのでバグがある
かもしれませんがランダム化のフローを
理解いただく参考までに。
<script language="javascript">
function rndview(min,max,num){
var a=new Array();
for (var i=min;i<=max;i++){
a[i]=i;
}
for (var i=min;i<=(min+num-1);i++){
var p1 = i+Math.floor(Math.random() * (max-i+1));
var p2 = a[i];
a[i]=a[p1];
a[p1]=p2;
}
txt="";
for (var i=min;i<=(min+num-1);i++){
txt+=(txt=="")?a[i]:","+a[i];
}
alert(txt);
}
</script>
<input type="button" value="ランダム" onClick="rndview(1,20,3)">
No.13
- 回答日時:
ソートが重いならこちらをどうぞ。
配列から既に選択した要素を取り除きながらランダムに選んでいく方法です。
ただ、10000個のとかから選ぶとなると要素数10000個の配列を用意しなければなりませんが。
function rnd_sel(min,max,num) {
var arr = new Array();
var results = new Array(num);
for (var i=0;i<max-min+1;i++) arr[i]=i+min;
for (var i=0;i<num;i++) {
var rnd = Math.floor((max-min+1-i)*Math.random());
results[i] = arr[rnd];
var tmp = arr[max-min-i]; //last
if (rnd!=(max-min-i)) arr[rnd] = tmp;
}
return results;
}
//インデントは全角スペースなのでご注意を...
No.12
- 回答日時:
No. 9 の、比較関数でランダムな比較結果を返すというのはアイデアとしてはいいと思いますけど、sort メソッドの仕様としては比較関数が 'a consistent comparison function' でない場合の動作は 'implementation-defined' だから、やっぱりまずいと思います。
確かに主要なブラウザではエラーは出ないようですが、仕様上エラーが出ないという保証はないわけですし。
(ところで、単にランダムな比較結果を返すだけならわざわざ 100 倍して引かなくても
function() { return Math.random() - 0.5; }
で十分だと思います)
No.11
- 回答日時:
IE,NN,FFで確認してますがエラーは出ないはずです。
それとも、sort(-1.3...)とか直接値を代入した場合の話ですか?
それはエラーになりますよw
sortには比較式 return (b - a); など比較関数で
負数~0~正数の範囲でソート順序を返すようにします。
あとはご自分でお調べ下さい・・
.
No.10
- 回答日時:
横からすいません。
arr.sort(function(){return Math.random()*100 - Math.random()*100;});
って、どういうことなのでしょうか。
sort(-1.3...)とかだと、もちろんエラーになってしまうのですが。
No.9
- 回答日時:
シャッフルの手法としては不完全なんですが
この程度のケースなら充分かと思います。
<script language="javascript">
arr = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20];
arr.sort(function(){return Math.random()*100 - Math.random()*100;});
document.write(arr[0]+","+arr[1]+","+arr[2]);
</script>
.
No.8
- 回答日時:
内容が似てますが、、、?
あちらのBBSでは、回答はつきそうにないですけどね。
方法は何種類かありますが、どの方法が良いか、というのは状況次第じゃないでしょうか?
>重複したら、リトライするという方式は一番してはいけない方法です。
基本的にはそうなんですが、分母がとてつもなく大きく、取り出したい数(分子)がごく小さな場合は、
重複したらリトライの方が早いことがあります。
(重複確認の方法によっては、とてつもなく遅くなります)
http://itmedia.okwave.jp/kotaeru.php3?q=2037528
ちょっと、こういう疑問がありますので、このBBSでの回答は控えさせて頂きます。
(アルゴリズム自体は一般的ですが、、、)
1つの方法として、参考URLを見てください。
参考URL:http://www.openspc2.org/reibun/javascript/form_t …
No.7
- 回答日時:
>高級言語は配列のランダム機能があったりするのでみなさんローレベルのランダム化にはなれていないのでしょうか?
>残念ながらみなさんのコーディングには問題があります。
>重複したら、リトライするという方式は一番してはいけない方法です。
>1000個の要素から1000個抜き出すときに、999番目の要素は約0.1%の確率でしか重複しない数値がヒットしません。
>要素数が増えると加速度的に時間のかかるプログラムです。
もちろんおっしゃることは、わかります、
#3のプログラムについて言えば、ある範囲の中から範囲に比べて少ない数が選ばれるということを想定したものです。
例えば、
1~10000(あるいはもっと大きい?)までの範囲の数の中から、3コ数を選びたいだけなのに、いちいちその範囲の数を重複させないためだけに候補を作るのは、いかにもムダです。
逆に、範囲のほとんど全数が必要になるなら、#3は、向かないのはおっしゃる通りですね。
そういったことは、ケースバイケースのように思われます。
#4については、いちいち評を挟みませんでしたが、#5でおっしゃる通りでかなり高コストだなあと思っていました。
No.6
- 回答日時:
1~20までの値と乱数の結果を入れる為の配列テーブルを用意して
1~20までの数値と乱数値をセットした後、乱数テーブルの値を用いて
ソートすれば求める結果が得られると思いますが?
No.4
- 回答日時:
少し違う考え方を書いておきます。
トランプと同じようなものだと考えて、20要素の整数を入れておく配列を作り、そこに1から20までの数値を入れておきます。それから乱数で0~19までの値を2つ作り、その値が違っていたらそれに対応する配列の位置の値を入れ換えます。これはトランプのシャッフルのようなイメージです。なので回数が多ければ多いほど順序がバラバラになります。で、十分にシャッフルしたら先頭の3つの値を残してあとは全部捨てれば終りです。
例) ボタンを押すたびに1~20の整数が重複なくランダムに3つカンマ区切りでテキストエリアに出て来ます。
<html>
<head>
<title>Random Test</title>
<script language="JavaScript">
<!--
function setrand() {
var max = 20;
var a = new Array(max);
var i;
for (i = 0; i < max; i++)
a[i] = i + 1;
for (i = 0; i < 100; i++) {
var p1 = Math.floor(Math.random() * max);
var p2 = Math.floor(Math.random() * max);
if (p1 != p2) {
var tmp = a[p1];
a[p1] = a[p2];
a[p2] = tmp;
}
}
document.f.t.value = a[0] + "," + a[1] + "," + a[2];
}
// -->
</script>
</head>
<body>
<form name="f">
<input type="button" value="PushMe" onClick="setrand()">
<input type="text" name="t">
</form>
</body>
</html>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) 表に書いてある単語を1つの行に重複させないで書き出したい。 複数の列行にそれぞれ職種が入力されている 6 2022/05/25 04:49
- Excel(エクセル) Excelの関数詳しい方お願いします。 13 2023/01/18 21:11
- Excel(エクセル) エクセル 可視セル部の数値の抜き出し方法 7 2022/05/14 13:49
- Excel(エクセル) ExcelVBAでリストの項目に必要数と同じ手配数を分配していくマクロを作りたいです。 1 2022/07/29 18:36
- 数学 既存の数列のランダム性について(初歩的質問) 2 2022/06/07 20:04
- Excel(エクセル) フォルダAから1つのファイルだけを、フォルダBへを移動するVBAについて 2 2022/07/25 11:45
- Excel(エクセル) ExcelのIF関数について 4 2023/05/24 12:54
- 統計学 不偏分散について 3 2022/03/29 15:57
- Excel(エクセル) Excel2019 列と列(2列)の数値の重複を調べたい 1 2023/05/11 13:35
- 数学 1から9の数字を書いたカードが一枚ずつある。これらの9枚のカードから同時に2枚を取り出し、数字の大き 5 2022/04/25 15:38
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Ascition Script2
-
Ajax Updaterでドラッグアンド...
-
起動するたびに、背景のファイ...
-
javascriptで配列の重複判定の...
-
配列番号を自動的に一括して入...
-
javascriptで入力フォームに日...
-
Googleスプレッドシートとスク...
-
配列データの利用方法
-
配列からNULL以外のキーを取得...
-
javascript 配列 変数名「arra...
-
外部ファイル読み込みと繰り返...
-
ループの中でインクリメント → ...
-
縦書き+右へ表示
-
【JavaScript】for文 お詳しい方
-
[Javascript]画面上にあるチェ...
-
同じIDで定義した要素の配列を...
-
JSON形式で取得した8桁の数字を...
-
JavaScriptの配列変数検索
-
Perlの配列をJavaScriptに渡せ...
-
行列データ?の文字列操作につ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C#テキストボックスの文字を配...
-
同じIDで定義した要素の配列を...
-
jspからjavascriptの変数引継ぎ
-
javascript 変数名の連結をしたい
-
undefinedを表示させない方法は...
-
二次元配列を使って順位をだす...
-
javascriptで2つのArrayの...
-
複数のフィードの読み込みが日...
-
二次元配列の全要素の全要素を...
-
javascriptを用いて作成された...
-
("Scripting.Dictionary")につ...
-
javascriptで行を抽出したいです。
-
JavaScriptで簡単なクイズを作...
-
1から20までの整数から、重複な...
-
javascriptついてお聞きします。
-
ぷよぷよの消去アルゴリズムが...
-
配列を作って総当たりで距離を...
-
配列の数ではなく、文字列の長...
-
jQueryで文字数カウンタ(複数...
-
jQuery text()で、<br>タグも取...
おすすめ情報