トップページ⇒php
1001コメント350KB

【Perl】初心者コーナー Part19

■ このスレッドは過去ログ倉庫に格納されています
0001nobodyさん03/01/11 13:52ID:???
初めに→「perl」その物のスレです。

1:自分はこう言う事がしたい。
2:それでこんな風にやってみたが・・・
3:それだとこんなエラーが出て上手く行かなかった。

1と3が無いと誰も答えられないよ。
良い回答は良い質問から。一緒に勉強しましょう。

あとは>>2-10にまかせた。
0002nobodyさん03/01/11 13:54ID:???
CGIだけど、なんか質問ある? Part 9
http://pc.2ch.net/test/read.cgi/php/1041530204/
参考書籍の話題は【Perl,CGI】参考書籍 第三版
http://pc.2ch.net/test/read.cgi/php/1030209573/
その他の雑多な話題は、【CGIに依存しないPerlの話題一般/Part2】
http://pc.2ch.net/test/read.cgi/php/1030548610/
スクリプトの改造依頼は 【 スクリプト改造工房 PART 5 】
http://pc.2ch.net/test/read.cgi/php/1028193595/
0003nobodyさん03/01/11 13:54ID:???
[過去ログ]
Part1 http://tako.2ch.net/test/read.cgi?bbs=perl&key=957208980 参照不能
 DAT: http://tako.2ch.net/perl/dat/957208980.dat
Part2 http://tako.2ch.net/test/read.cgi?bbs=perl&key=971817087 参照不能
 DAT: http://tako.2ch.net/perl/dat/971817087.dat
Part3 http://tako.2ch.net/test/read.cgi?bbs=perl&key=979894521 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part4 http://tako.2ch.net/test/read.cgi?bbs=perl&key=984430156 参照不能
 DAT: http://tako.2ch.net/perl/dat/979894521.dat
Part5 http://pc.2ch.net/php/kako/988/988728069.html
Part6 http://pc.2ch.net/php/kako/996/996075607.html
Part7 http://pc.2ch.net/php/kako/1000/10002/1000267444.html
Part8 http://pc.2ch.net/php/kako/1003/10039/1003900311.html
Part9 http://pc.2ch.net/php/kako/1009/10095/1009549309.html
Part10 http://pc.2ch.net/php/kako/1014/10145/1014556702.html
Part11 http://pc.2ch.net/php/kako/1017/10172/1017201229.html
Part12 http://pc.2ch.net/php/kako/1019/10199/1019917048.html
Part13 http://pc.2ch.net/php/kako/1022/10227/1022731565.html
Part14 知らん
Part15 http://pc.2ch.net/test/read.cgi/php/1028816385/
Part16 http://pc.2ch.net/test/read.cgi/php/1032070299/
part17 http://pc.2ch.net/test/read.cgi/php/1034583844/
part18 http://pc.2ch.net/test/read.cgi/php/1037797479/


[ひまぢん氏のミラー]
Part1 http://www.angelfire.com/ak5/2ch-web-program/kako/957208980.html
Part2 http://www.angelfire.com/ak5/2ch-web-program/kako/971817087.html
Part3 http://www.angelfire.com/ak5/2ch-web-program/kako/979894521.html
Part4 http://www.angelfire.com/ak5/2ch-web-program/kako/984430156.html
Part5 http://www.angelfire.com/ak5/2ch-web-program/kako/988728069.html
00042,303/01/11 13:55ID:???
他、なんかある?
0005103/01/11 13:57ID:???
>>4
いや。
あrがとう。
0006nobodyさん03/01/11 14:01ID:???
>>1-
O2
0007nobodyさん03/01/11 14:01ID:NBoN4jVX
use CGI を使ってるんですが、
フォームで
<INPUT type="hidden" name="id" value="test_id">
というタグがあるので、これを受け取るのに

use CGI;
my $q = new CGI;
$q->param('id');

で受け取れるんですが、これそのものを正規表現にかけたいんです。例えば
例えば、@list にIDのリストが入ってるとして、

if(join(',',@list) =~ /$q->param('id')/){
  print "あなたのIDはリストに含まれています!";
}

こんなかんじで。
でも正規表現内に $q->param('id') な記述が許されないようなので

my $a = $q->param('id');
if(join(',',@list) =~ /$a/){
  print "あなたのIDはリストに含まれています!";
}

と書かなくてはならない、これがめんどくさい!
どうにか1行で書けないもんでしょーか?
0008nobodyさん03/01/11 14:05ID:???
>>7
リファレンスのデリファレンス
0009前スレ99303/01/11 14:05ID:???
>>前998
そうですね。
正確に測ったわけではないですが、異常なほど数値が片寄ります。
例えば、1-100までの整数が出るようにした場合、数回連続で同じ数字を取得したり、
同じような条件下では絶対に出ないような数字もあります。

>>前995さんが言っていたようなOSから取得するとかではなくて、
多少処理や記述が複雑になっても良いから、独自にランダム性の高い処理を作っている人はいないのでしょうか?


例えば、初期値の法則に「時間」を組込んでしまうと、
CGIの1アクセスで100の数値を取得した場合、ランダム性のカケラも見えず、
同じ数字がわんさか出ます。

0010nobodyさん03/01/11 14:08ID:2PtCQo+x
>>7
その処理は普通、grepを使って、こうする。。けど回答になってないな。。

if ( grep { $_ eq $q->param('id') } @list ) {
0011903/01/11 14:15ID:???
前スレ993の文をこちらにコピーしておきます
【perl】
ランダムから求められる数値が片寄ってるような気がしてなりません。
ランダムを取得する時、必ず直前に以下のような記述を置いているのですが、
正確な意味も分かりません。
(昔、どこかで見たのを写したのだと思います)

srand(time ^ $$ ^ unpack "%L*", `ps axww | gzip`);

質問1
上記はどんな初期値(?)を作成してるのでしょうか?

質問2
とても効率が良く、数値が片寄る事を感じさせない記述を教えて下さい。
皆様はランダム前にどんな記述をおくのでしょうか?
イロイロ教えて下さい。

また頭が弱いため、見ても理解出来ないと思うので、どのように求めているのかも簡潔に教えてくれると嬉しいです。
0012nobodyさん03/01/11 14:17ID:???
>9
それってさ、srandを複数回行なってない?
srandは1回行なえばそれでいいんだが。
ソース出して。
0013nobodyさん03/01/11 14:21ID:???
一応、例として。

悪い例:
foreach(0 .. 100){
  srand(time);
  print rand(100);
}

正しい例:
srand(time);
foreach(0 .. 100){
  print rand(100);
}

srandは「乱数のスタート位置を決める」もの。
randは「スタート位置から決められた順番をなぞる」もの。
srandを何回もやれば、スタート位置が毎回戻るから、同じ結果にしかならんぞ。
0014903/01/11 14:23ID:???
ちょいとソースは…無理(一万行近くあるので)

えと、実はランダム取得前に何度も置く事が多いです。
srandしてからrandみたいな。

しないほうが良いのでしょうか?

また、しない事もありますが、それでもやっぱり片寄ってきます。
例えば、RPGを作っていて、ランダムにストーリーが分かれるのですが、
プレイヤーの話を聞いてみるとみんな似通った結果になる事が多く、綺麗に分かれていません。

その「ランダムによって分ける」と言う作業自体は非常に単純な処理にしてあるので、
おそらく自分ではあくしていると思います。
で、どんな角度から考えてもやはり原因は「ランダム」が「ランダムじゃない」と言う事にあるようです。
0015903/01/11 14:25ID:???
>>13
ありがとう。
すごくありがとう。
0016nobodyさん03/01/11 14:30ID:2PtCQo+x
srandを2回以上やるのは禁止。

srand、randで、1方向ハッシュみたいに使うのも禁止。
それは他に移行してもそのまま動くのか?と。
0017nobodyさん03/01/11 14:32ID:P/LXfaGE
種が同じなら同じ花しか咲かない
0018nobodyさん03/01/11 14:34ID:2PtCQo+x
で、種から花を作る、そのアルゴリズムは統一されているのか。ということ。
001916=1803/01/11 14:36ID:???
あ。自分は関係なかったかも。。
0020えせカミ03/01/11 14:38ID:???
>>7
if(join(',',@list) =~ /$q->param('id')/){
↓
if(join(',',@list) =~ /${\$q->param('id')}/){

でもこの書き方が好きかい?綺麗かい?
0021nobodyさん03/01/11 15:12ID:???
>14
srandは2回以上やっちゃいけない。
「同じ乱数を複数回使いたい」とか特殊な状況でもない限り。
どうしても2回以上srandをするなら、種も変えるべき。

基本的にはスクリプトの頭で1回だけsrandすればいい。
Perl5以降なら、それすらも必要ない。
0022903/01/11 15:13ID:???
では、ずうずうしいようですが
品質の良い種を皆様から多数頂けないでしょうか?

種の内容も簡単に説明してくれると嬉しいです。

0023nobodyさん03/01/11 15:14ID:???
>22
品質のいい種は前スレで出てたあれ。
理由は今のあんたに説明してもわからんだろ。
ちゃんと覚えたいなら駱駝本(プログラミングPerl)買え。
0024903/01/11 15:18ID:???
あと、以下の記述は俺が使う条件下ではあまり品質が合っていないようです。

srand(time ^ $$ ^ unpack "%L*", `ps axww | gzip`);

今の一番の問題は時間です。
同じ時間だから似たような結果になる、と言うのを避けたいです。

同じ条件下で1000回以上「1-100」の整数を求めた時、
「連続して同じ数字が出ない」
と
「平均的に全て出てくる」
と言う条件を満たしたのがグットです。
0025903/01/11 15:19ID:???
>>22
分かりました。
買います。

0026nobodyさん03/01/11 15:22ID:???
>>24
> 「連続して同じ数字が出ない」
どんな乱数でもこの条件は満たせないと思うんだがな。
任意の二数を取り出して同じ数字な確率ってほんの1/10000でないかね?
0027nobodyさん03/01/11 15:24ID:???
>>26
言ってる事が矛盾してないか?
それと1/100だと思うぞ。
0028nobodyさん03/01/11 15:27ID:???
>>27
あ、1/100だわ。スマン…寝ぼけてたようだ。
矛盾はしてない気がする。千なり一万なり生成して連続して同じ数字が出ない
様な乱数系列ってほとんどあり得ないと思うんだが。
0029903/01/11 15:32ID:???
>>26と28
ええと、
srand(time ^ $$ ^ unpack "%L*", `ps axww | gzip`);
の記述では、例えばCGIでPERLを使い、1アクセスで1つの数字を求めたとします。

ですが、連打して求めてしまうと同じ数字が返って来る事が非常に多いのです。
当たり前と言えば当たり前なんですが、これをなんとかしたいです。
00302603/01/11 15:37ID:???
スマン。とことんまで寝てたらしい。やっと理解した(苦笑)
種ねぇ…その記述よりいいのなんておもいつかんわ。
0031nobodyさん03/01/11 15:42ID:???
>>29
アクセスカウンタも一緒に与えれば。
0032903/01/11 15:52ID:???
>>31
アイディアありがとう御座います。
でも、多くの人に連打される状況下にあるのでちょっと難しいかも…


で、ちょっと考えてみました。
最後のワガママです。


------------------

srand(ここを適当に考えてほしいです);
$aaa = rand;

srand(time ^ $$ ^ unpack "%L*", `ps axww | gzip`);
↑この中に$aaaを追加したいのですが、記述の意味が俺にはイマイチ理解出来ないので考えてほしいです。

------------------

以上。

すごくワガママですが、お願いします。
0033903/01/11 16:27ID:???
そいや書き忘れました。
>>28
>>同じ条件下で1000回以上「1-100」の整数を求めた時、
>>「連続して同じ数字が出ない」
↓
>矛盾はしてない気がする。千なり一万なり生成して連続して同じ数字が出ない
>様な乱数系列ってほとんどあり得ないと思うんだが。

そうですね。
例えば、1回で1/100になるのだから、
1000回やると
(1/100)×(1000)
って事になります。

結果的に、1000回ループした場合、同じ数字が連続して出るのは「10回前後」と言うのが
もっとも効率が良いランダムって事になります。

そして、それが全然満たされていないのが現状です。
これを言いたかったのです。
0034nobodyさん03/01/11 16:35ID:???
>32
それが意味ないってまだわからないか?
最初のsrandが変わらなければ、$aaaも同じ数字にしかならない。
記述の意味が理解できないってなら、自分で検索するなり何なりで調べろ。
駱駝本買うって言ったなら買って読め。
いい加減しつこい。
0035nobodyさん03/01/11 16:37ID:???
よく、 CGI スクリプトで srand(time ^ $$) としているものがありますが、ヒット回数が非常に多い場合、
次に実行される時点で時間とプロセスIDがそれぞれ1ずつ増加することになるケースが考えられます。
このようなケースでは、結果 x^y == (X+1)^(Y+1) ということになり、1/3 のかくりつで同じ数が発生することになります。

引用:CGI&Perlポケットリファレンス P.223 TIPSより
(藤田郁、三島俊司著 技術評論社 発行 ISBN-4-7741-0755-7 C3055)

要因はこれのようですね。
0036nobodyさん03/01/11 16:42ID:???
$$ 毎に種を生成する。
っていうのはどうだろう?

if ($$%10 == 0) { srand( time + $$); }
if ($$%10 == 1) { srand( sin(time + $$)); }
if ($$%10 == 2) { srand( cos(time ^ $$)); }

みたいな。
0037nobodyさん03/01/11 16:45ID:???
>>34
いいえ?
少なくともダブルクリック時には変わりますよ?

それと、統計を取ったわけじゃわりませんが、
同じsrandを繰り返しても必ず同じ結果になるわけではありません。

>>32のは分岐点を増やす意義があります。

あと、実際の記述を1つも書いていないのにしつこいとははちょっと…。
答えたくないのなら無視していればどうかと…。

>>35
そうです。
俺のもだいたい1/3くらいでした。

そこで提案したのが>>32なのですが、実際の記述方法が分からないため、
2ちゃんねらーの方々の知恵を借りようと思ってやってきました。
0038903/01/11 16:49ID:???
>>37も自分です。(すみません)

>>36
$$とはなんでしょうか?
すみません頭弱くて。

連打アクセスでもランダム性が保持出来るのなら、ありがたくちょうだいいたします。
0039nobodyさん03/01/11 16:53ID:???
ぷ
>>37の突っ込みで思わず笑ってしまった。

>>34記述が書けないならレスするな。
1回も答えてないのにしつこいって…。久々にワラタよ。
0040nobodyさん03/01/11 16:54ID:???
>>38
「$$」は、特殊変数です。
んーPerl関連の書籍とかには載っているかと思うけれど(苦笑)
いわゆる、PID、自身のスクリプトがPerlで実行されたときに付与される起動プロセス番号です。(UNIX系のみ?)
0041nobodyさん03/01/11 16:54ID:???
>37
統計を取らない。
実際の記述を出さない。
だから嫌われるのがわからんのか?
1万行あるってなら、txtにしてアプしろよ。
そもそもお前は聞いてばかりで自分で調べようとしてないじゃないか。
まずはsrandやrandが具体的にどういう効果を持っているかも未だに理解してないんだろ?
これだけやりとりして、その間、お前は聞くばかりで自分で調べようとしていない。
1から10までここで聞く気か?

>同じsrandを繰り返しても必ず同じ結果になるわけではありません。
同じ定数なら確実に同じ数値が返る。
お前が言ってるのは、時間などの変化のある数字を使っているから、
srandに渡される数値が変わって、結果的に異なる初期化方法になってるだけ。
つまり、最初のsrandで確実に異なる数値を渡せるなら、その後に$aaaを
使ってsrandしなおす必要はないだろ?

最初のsrandが同じになる → $aaaも同じになる → 2度目のsrandも同じ結果になる
最初のsrandが異なる結果になる → 2度目のsrandをする必要がない
これくらい消防でもわかるわ。

今まで答えて損した気分だ。
宿題は自分で考えな。
0042前スレ998=12=13=21=23=34=4103/01/11 17:00ID:???
>39
結構レスしてると思うんだけどね?
0043903/01/11 17:05ID:???
>>39
いえ、別に答えてないとまでは…

>最初のsrandが同じになる → $aaaも同じになる → 2度目のsrandも同じ結果になる
ええと、
連打アクセスでも最初のsrandは同じになるのでしょうか?

分かりました。
srandを調べてみます。

>>40
ありがとうございます。
その方法を一度テストしてみますm(__)m
0044903/01/11 17:09ID:???
>>42もありがとうござしますた。

あと>>30などの皆様方もどうもです。
0045yani ◆saNSktNEdQ 03/01/11 17:14ID:umfOb+ix
今ちょっと毎秒20hitを模擬してみたが,
time ^ $$ ^ unpack "%L*", `ps axww | gzip`
は何回やっても重複しなかったな。
(毎秒20回以上になると、俺のボロマシンでは重くて「同時」にならない)

ただ、ps とか gzip 起動しているからその分、ちょっとプロセス数を増やして行くと
、Resource temporary unavailableがすぐに出る。
そのときに件の式がどういう挙動しているかはよく分からない。
Perl5自身に任したほうが良いような気がするな。
0046nobodyさん03/01/11 17:23ID:???
>43
言い方悪かったな。
要するにお前は、同じ乱数が出るから困ってるんだろ?
その原因はsrandであると。
同じ順番で乱数が出てる時は、srandが同一である可能性が高いんだよ。
>35さんの言うやり方なら、1/3で同じってことか。
お前さんがやりたいのは、その「1/3の確率で同じになった時に、
別の乱数になるようにしたい」って事じゃないのか?
つまり、その時点ですでにsrandは同じわけだよな。
だとしたら、$aaaに出てくる数字も同じ、その後のsrandも同じになるわけ。
わかる?

連打アクセスの場合はプロセスIDが異なるから同じにならない事がある。
ただ、それでも同じになる場合があるから困ってるんでしょ?

本気で覚えたいなら、srandとrandの事を自分できちんと覚えるしかないのさ。
検索なりなんなりでそういう説明ページ探したか?
そういう努力をしようという姿勢が見えないって事。

こっちだってsrandやrandの説明からまでは付き合えんって事さ。
そこまで回答者に説明させる気?
それくらい自分で調べてから聞いてくれと。

最後に俺の駱駝本に載ってたやり方を参考までに載せとく。
srand(time ^ ($$ + ($$<<15)));

場合によるが、Webサーバー上のCGIであり、同一人物の同時アクセスを想定しないなら、
IPアドレスなりUSER_AGENTなりを式に組み込む手もある。
0047nobodyさん03/01/11 17:27ID:???
>今ちょっと毎秒20hitを模擬してみたが
ってどうやってやるんですか?
F5連打じゃないっすよね?telnet?専用クライアントでもあるんでしょうか?
0048yani ◆saNSktNEdQ 03/01/11 17:31ID:85OU0JtJ
>>47
子プロセス20個起動して、ある時刻に一斉に件の式をprint
0049nobodyさん03/01/11 18:02ID:???
も、もうちょっと具体的に知りたい。
>子プロセス20個起動
がすでにわからん。これはどういうところ勉強すればいいんでしょう?
0050nobodyさん03/01/11 18:33ID:???
>49
ttp://www.google.com/search?as_q=perl+%E5%AD%90%E3%83%97%E3%83%AD%E3%82%BB%E3%82%B9+%E8%B5%B7%E5%8B%95&num=100&hl=ja&ie=UTF-8&oe=UTF-8&btnG=Google+%E6%A4%9C%E7%B4%A2&lr=lang_ja&as_ft=i&as_qdr=all&as_occt=any&as_dt=i
こうやって検索すると
tp://mind.f.fiw-web.net/program/perl/tips0301.html
こんなページが見つかる。
0051nobodyさん03/01/11 19:47ID:???
>>9
っていうか掲示板なんだから、自分以外にも利益がある(可能性がある)
ことを書けや。。出来ないなら出て行け。

はっきり言わせてもらうと、おまえより賢いやつはこの板には沢山いる。
自分の間違いに気づけ。そして、勘違い発言を増殖させるな。
0052nobodyさん03/01/11 20:48ID:L83LO6Ji
正規表現で、例えば<B></B>でくくられた部分をとってくるにはどう書けばいいでしょうか?
例えば、"<B>hoge</B><B>fuge</B>"
っていうので、hogeってとこだけをまず取りたいのですが、何も考えないで書くと
hoge</B><B>fugeが取れてしまって困っています。何か上手い書き方があったら教えて
下さい。
意味不明だったらすみません。
0053nobodyさん03/01/11 20:52ID:???
>52
正規表現に最小のマッチングというのがある。
調べてみ。

それよりも"<B>hoge<B>hage</B>hige</B>"という文字列だったらどういう処理にするつもり?
それによってかなりやり方が変わるから。
0054nobodyさん03/01/11 20:59ID:???
>>53
ありがとうございます!
調べた結果、?を一文字つけるだけで解決できました。

 入れ子構造になってるのは・・難しそうだから考えないようにしようかなと思ってます・・。
00555403/01/11 21:02ID:???
あ、でも、"<B>hoge<B>hage</B>hige</B>"というものに対して、
hoge<B>hage</B>higeが取れれば、やれることが広がるので、
上手く書く書き方がありましたら教えて頂けると嬉しいです。
0056nobodyさん03/01/11 21:12ID:???
>それよりも"<B>hoge<B>hage</B>hige</B>"という文字列だったらどういう処理にするつもり?

タグでネストは無いと思いますが…。
# 閉じ忘れはあるかもしれないですが。
0057nobodyさん03/01/11 21:23ID:???
>>56
<TABLE>の中に<TABLE>とか、<DIV>の中に<DIV>とか。
0058nobodyさん03/01/11 21:40ID:???
>>57
おー、なるほど。
<div><p><div></div></p></div>とか、ありですね。
0059903/01/11 21:54ID:???
えと、
イロイロ調べた後に実験しました。

$$は、別に混雑してようとしてまいと関係なく、連打なら「1づつしか増えませんでした」
まだしっかりとsrandの性質を理解出来てないのかもしれませんが、やはりこれに原因があるのではないかと考えます。

で、皆様の書き込みを参考に以下の記述を作ってみました。

-----------------

if ($$ % 2 == 0) { srand(time); }
if ($$ % 2 == 1) { srand($$); }
#↑1づつ増えるた時に困るのだから、奇数か偶数によって変える。

$rand_a = int(rand(9999));
$rand_b = int(rand(9999));
$rand_aa = (time - $rand_a);
$rand_bb = ($$ + $rand_b);
#↑「time」と「$$」は、時間が近いととても似た数字になるため適当に変える。

srand($rand_aa ^ $rand_bb ^ unpack "%L*", `ps axww | gzip`);
#最後にこれを置いて完成。

---------------------

まだこれのテストはしてませんが、取り敢えず完成したので報告しに来ました。
また、問題な点があれば教えて下さい。

0060nobodyさん03/01/11 21:56ID:???
>55
それはまた難しいぞ。
"<B>hoge<B>hage</B>hige</B>fuge</B>"の時はどうするかとか。
"hoge<B>hage</B>hige"でいいのか、"hoge<B>hage</B>hige</B>fuge"まで取るべきか。

>56
プログラマーはユーザーがどんな意表をついた入力をしても大丈夫なようにシステムを考えないといけない。
そういうところで気を抜くとセキュリティホールができたりしちゃうからね。
0061nobodyさん03/01/11 22:05ID:???
すべての入力を、例外なく処理できないならば、それはバグである。
みんなが、まともなブラウザ、まともな思考回路を持っているとは限らない。

あと、一番忘れやすいのは、$ENV{HTTP_*}は汚染されているということ。
$ENV{HTTP_USER_AGENT}とかは特に。これをタグの無効化をせずにHTMLでの
出力に使ったりすると、クロスサイトスクリプティングちゅーやつが発生する。
0062nobodyさん03/01/11 23:05ID:???
>>59
いやあのそのどのこの、srand を2回以上やっても(以下略^^;)

> if ($$ % 2 == 0) { srand(time); }
> if ($$ % 2 == 1) { srand($$); }
> #↑1づつ増えるた時に困るのだから、奇数か偶数によって変える。
1秒間に3回以上アクセスがあると、$$%2 == 0 の時は重複しまつ。ので却下(^-^*)

そもそも、time ^ $$ に問題があるので、この部分をえろえろと変えてみればどないでし?
例えば・・・
my $pid = $$;
srand((time & 0xFFFF) ^ (($pid << 8) | ($pid & 0x00FF) ^ 0xFFFF));
とか。
(65536通りの種。同位置時刻に複数アクセスがあっても、PIDを奇数と偶数バイトを入れ替えてからビット反転しているので、連続した種は256以上のアクセスが来たとき以外は出てこない。ん?あってるのか?)

ところでPerlに、ビットのローテートできる演算子ってあるのかな?無いのかな?
0063nobodyさん03/01/11 23:39ID:???
>>62
びっとのローテートは >> << だよん。
$unko>>1 で、1さんに……じゃなくて、$unkoを右に1ビットシフト。空いたビットは0で埋め立て。

しかしまぁ、以前にも「完全な乱数は無理」ってレスがあったはずなのに、しつこいのがいるね。
コンピューターの作る乱数なんぞ「計算」で求めてるにすぎないのだから、いくら種を工夫した
ところで、分布に偏りができてしまうのは仕方が無い。
00649は必ず読むこと。03/01/12 00:07ID:pN++dQ77
/dev/randomを、Perlから使いたいなと思ってちょっと調べてみた。一番簡単な方法は、
Crypt::Randomになるのかな。他にもあるかも。

>>9にはこれをseedに使うことを勧める。ゲームのためにコストのかかる乱数
を作るのは、もったいないと思うけど。

それに、おそらく標準のrand()の線形合同法(?)の周期も気になるだろうから、
Math::Random::MT(究極の擬似乱数生成のモジュール)も併せて使っていただきたい。

FreeBSDなら、rndcontrolでIRQを設定しておかないと、/dev/randomのエントロピープール(?)
がなかなかたまらないから注意すること。
0065nobodyさん03/01/12 00:25ID:???
>>64

open(MD5FILE,">$md5datefile");
my $data = "";
sysopen(RANDOM, "/dev/random", O_READ) || die "cannot open /dev/random $!\n";
sysread(RANDOM, $data, 16);
close(RANDOM);
print MD5FILE "$MD5DATE<>$data";
close(MD5FILE);
$md5->add($data);

bbs.cgi(2ch) での ID 生成ルーチンの中で、こんなことをやっているのがありますた。
参考程度に。
0066nobodyさん03/01/12 00:30ID:pN++dQ77
あぁ。Math::Random::MTはseedに32bit以上の数を渡す事ができない・・
これでは満足できないでしょ。
0067nobodyさん03/01/12 01:35ID:???
古いし、使った事ないけどMath::TrulyRandomはどう?
0068貧乏パーラー03/01/12 02:48ID:???
perl式のお試し用read-eval-print。
rep.plとして作成
-----
while(<STDIN>) {
print eval($_)."\n";
print $@ if ($@);
}
1;
-----------
これで
perl rep.plで起動し
試したい式を入れれば評価結果が表示猿。
0069nobodyさん03/01/12 07:21ID:???
>>58
> <div><p><div></div></p></div>
pはインライン要素のみ
とか、揚げ足とってみる。
0070nobodyさん03/01/12 11:57ID:oJAGmVM6
my $a = 'これはグローバル変数です';

ってやったら、この$aは暗黙で $main::a と扱われるんだよね?
じゃあ

my $a = 'グローバル変数です';
for(0..10){
  my $a = 'これはfor内のローカル変数です';
}

ってやった場合、もちろんこのふたつの$aは区別されると思うけど、
forの外にあるのは $main::a
じゃあfor内の$aは何? これも暗黙のうちに $main::a になるの?
0071nobodyさん03/01/12 12:19ID:tUI5W5YD
画像アップ掲示板を改造しているのですが、
フルパスからファイル名だけを取り出す方法が分かりません。
OSによって:\/など区切りが違いますけど
どうやって取り出せばいいのでしょうか?
0072nobodyさん03/01/12 12:21ID:???
>>70
myで宣言した変数が$Package::varnameで参照できるの??
初耳だYO
0073nobodyさん03/01/12 12:25ID:eJ8Igs3E
今ホムペつくってるんですけど、a.htmというページがあるとしてそこに5人
きてるとします、それでその人数を、b.htmに表示したいんです。
それでhttp://shena.myako.net/strangelady/cgijs/imakoko/imakoko.html
っていうのをみつけたんですがこれはa.htmにきている人数をa.htmにしか表示できないみたい
なんです、このスクリプトを変更してb.htmにでも人数を表示するということはできませんか?
もしそういうことができるなら誰かアドバイスください★
0074nobodyさん03/01/12 12:30ID:???
>>71
$fullpath = 'c:\hoge/hoge:hoge\aaa.ccc';
($file) = $fullpath =~ m|([^:\\/]*$)|;
print $file;
0075nobodyさん03/01/12 12:40ID:???
>>73
マルチで書き込むのはやめてYO
0076nobodyさん03/01/12 12:54ID:pN++dQ77
>>70
our $a;なら、そうなる。
■ このスレッドは過去ログ倉庫に格納されています