- 締切済み
Javascriptの質問です。
Javascriptの質問です。 10個の結果を格納する配列に、1から100の乱数を重複せずに格納し、 htmlの<p id="result">...</p>の...の部分にスラッシュ区切りで表示させるにはどうすればよいでしょうか?
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- babu_baboo
- ベストアンサー率51% (268/525)
#2,3 です。 かきなおしました。ぜんかくくうはくは、はんかくに。 ぶらうざのしていがないので、じぶん きじゅんです。 しつもんがあるたびに、それようのぷろぐらむをかいていては、はんようせいがありませんね。 やりたいことができたのなら、そのきのうをめいかくにわけて、つくるべきです。 るーぷするところに、「正規表現」をつかうのは、・・・です。 らんだむにとりだすなら、すうちだけでなく、いろいろなものをとりだせるようにしたいものですね。 いったいいつから、「配列内包」とかつかえたんでしょうか?ひろまりませんね。 Array.map とか、Array.reduce もべんりなのに・・・ とてもざんねんです。 はいれつをきりだすしょりは、おそいかもしれませんが、いまのわたしは、こまりません。 だれに言ってんだ? <!DOCTYPE html> <title></title> <meta charset="UTF-8"> <body> <p id="result"></p> <script type="application/javascript; version=1.8"> function range (a, b) { while (a <= b) yield a++ }; function loop (n) { while (n) yield n-- } function randomGenerator (range) { var copy = []; var len; while (true) if (len = copy.length) yield copy.splice (Math.random () * len |0, 1); else copy = range.slice (0); } var num = randomGenerator ([x for each (x in range (1, 100))]); var ary = [num.next () for each (x in loop (10))]; document.querySelector ('#result').textContent = ary.join ('/'); </script> </body>
- fujillin
- ベストアンサー率61% (1594/2576)
すでに回答が出ていますが… そのまま文字列を作ってしまう考え。 頭が悪いので、単純にしている分古いブラウザでも動く(?) (区切り文字に正規表現の演算子を指定しないように) <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html lang="ja"> <head><title>sample</title> <meta http-equiv="Content-Script-Type" content="text/javascript"> </head> <body> <p id="result"></p> <script type="text/javascript"> document.getElementById("result").innerHTML = (function(max, n, sep){ var result = "", i = 0, val; var pre = "(^|"+sep+")", post = "("+sep+"|$)"; while(i<n){ val = Math.random() * max + 1 | 0; if(!result.match(new RegExp(pre + val + post)) && ++i) result += (result?sep:"") + val; } return result; })(100, 10, "/"); // 最大値、選択数、区切り文字 </script> </body> </html>
- babu_baboo
- ベストアンサー率51% (268/525)
#2です まちがえた function fisherYates (a, b, c, d) a.concat (d.splice (Math.random () * (c + 1) |0, 1));
- babu_baboo
- ベストアンサー率51% (268/525)
<!DOCTYPE html> <title></title> <meta charset="UTF-8"> <body> <p id="result"></p> <script type="application/javascript; version=1.8"> function fisherYates (a, b, c, d) a.concat (d[Math.random() * c |0]); function random (a) a.reduceRight (fisherYates, []); function range (a, b) { while (a <= b) yield a++ }; document.querySelector ('#result').textContent = random ([x for each (x in range (1, 100))]).slice (0, 9).join ('/'); </script> </body> ひとのことは とやかくいえませんが、 Array.filter より、Array.indexOf だと おもいます じぶんのことで、 fisherYates で、c == 0 のとき、むだですね。
- Gaffgarion
- ベストアンサー率45% (45/99)
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="utf-8"> <title></title> <script> (function(){ var list = function(arr){ var num = 1 + Math.floor( Math.random() * 100 ); if(arr.length > 0) arr = arr.filter(function(v){ return (num != v) }); arr.push(num); if(arr.length < 10) return arguments.callee(arr); return arr; } window.addEventListener('load', function(){ document.getElementById('result').textContent = list([]).join('/'); }, false); </script> </head> <body> <p id="result"></p> </body> </html> ・配列の重複削除はもっと良いやり方や一般的なやりかたがあるのかも。 ・IEで動かすにはaddEventListenerとtextContentをクロスブラウザ対応に書き換えてください。