Perlでランダムに0と1をかぶらずに出力する方法
- Perlのランダム関数を使用して、0と1をバラバラに出力する方法について教えてください。
- 現在のコードでは、稀に0と1がすべてかぶる現象が発生しています。
- 0(□)はかぶらないようにする方法を教えてください。
- ベストアンサー
Perl ランダム 0と1 かぶり
いつもお世話になっております ご教示お願い致します。 □←0 ■←1 とします。 この0と1をランダムに5こでるようにします。 ↓ 例1) □■■□■ 例2) ■■□□□ このようにバラバラに出現させることができました。 しかし、 極稀になのですが、 □□□□□や■■■■■ とすべてかぶることがあります。 この■(1)はすべてかぶってもいいのですが、 □(0)はかぶらないでほしいのです まずそのソースが下記・・・↓ srand(time()^($$ + ($$<<15))); our $val1 = int(rand(2)); our $val2 = int(rand(2)); our $val3 = int(rand(2)); our $val4 = int(rand(2)); our $val5 = int(rand(2)); 0と1が必ずバラバラになるようにするにはどのように するのでしょう?
- perlhogehoge
- お礼率82% (32/39)
- Perl
- 回答数2
- ありがとう数2
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
□or■の2つの状態を 1bit(2進数)に割り当てると それが5つなので、 5bitのデータで表せることになりまますので、 rand(2)を5回実行すのではなく 特定のものを除外した5bitデータを1度のrandで生成すれば 簡単だと思います。 つまり、5つの□or■を、10進数で示すと □□□□□=0 □□□□■=1 □□□■□=2 □□□■■=3 ... ■■■■■=31 の0~31となりますのが このうち □□□□□=0 のみを除外したいなら、 1~31をrandで生成すればよいことになります。 これは $val = int(rand(31)) + 1; (rand(31)で0~30の範囲の返り値をもらって、それに+1) ですので、 あとは、この値を、2進数に分解して各bitが0なら□, 1なら■とすればよいかと。 たとえば、 1→00001 →□□□□■ ... 25→11001→■■□□■ ... 31→11111→■■■■■ という形です。 10進数から5つの0or1への変換は $bin = sprintf ("%05b", $val); で5桁の2進数の文字列にしてから、1文字づつ取り出せばよいかと。
その他の回答 (1)
- kichi8000
- ベストアンサー率41% (658/1581)
かぶらなくなるまで「やり直しループ」させる
お礼
ご回答ありがとうございます・・・ IFで全てが0だったとき~するという処理は試してみたのですが、 そこにどうループを埋め込めばいいのかわからないです・・・
関連するQ&A
- ランダム
こんにちは。C++の初心者で Microsoft VisualC++ 6.0 を使っています。 たとえば、0から10までのランダムの数字の足し算を 10回表示したいとき、 #include<iostream> #include<ctime> #include<cstdlib> using namespace std; int main(){ int count = 0; int numA, numB; srand(time(0)); while(count < 10){ numA = rand() % 10 + 1; numB = rand() % 10 + 1; cout << numA << " + " << numB << " = "<< numA + numB << ndl; count++; } return 0; } が使えますよね。 それと似たように、あらかじめ用意した4つの単語を ランダムに10回表示するにはどうすればいいのでしょうか。 たとえば、 flower, car, house, book の4つをランダムに car car flower book flower house book car house car と出力したい、ということです。 よろしくお願いします!!
- ベストアンサー
- C・C++・C#
- Excelでのランダムな整数の出し方
A1のセルに、ルーレットのようにランダムな整数を 表示させたい時は、 =INT(RAND()*10) という関数を使うのだと思いますが、 これだと0~9までが均等に出現しますよね。 A1には、0,1,2の3つのみを ランダムに出現させたい、という場合は どのように設定すればいいのでしょうか? 宜しくお願いします。
- ベストアンサー
- オフィス系ソフト
- シェルで、ランダム関数を変数に代入したい
#!/bin/bash (1)BAR = `awk ' { printf("%d", srand()%10) }'` (2)BAR = `awk '{ print srand()%10 }'` (3)BAR = `awk '{ print int(10.0*rand()) }'` echo "$BAR" 上記のように変数にランダム関数を代入したいのですが、うまくいきません。 awk '{ print int(10*rand()) }' だけでうってみると、 2 2 8 ……… のように、延々と続いてしまい、一回で終わらないのがとても気になります。 awk ' function hoge(n){ return 1 + int(rand()*n) } { print hoge(10) } ' のように、関数をからませてもうまくいきません。 どうか、解説をお願いします。 なお、OSはLINUXのFedora10で、Tera Termを使ってクライアントから操作しています。
- ベストアンサー
- その他(プログラミング・開発)
- ランダムに背景画像を変える方法。
掲示板などのCGIの背景をランダムに変えたいのですが、 どうすればいいのでしょうか? あるサイトでは、 @backimg =('img1.gif', 'img2.gif', 'img3.gif'); srand(time); $imgno=rand($#backimg+1); そして $body="<body background=\"$backimg[$imgno]\">"; となっていたのですが、これをCGIに埋め込んでもうまく動きません。 (img1.gifしか表示されません。) どうすれば背景画像をランダムに変化させることができるのでしょうか?
- ベストアンサー
- CGI
- C言語/ランダムbeepのプログラム方法
プログラムを書いていますが理解に苦しんでいます。 勉強し始めたばかりなのでかなりハードです。どなたか助けていただけませんか。 前に進めずにいます。 何をしたいかというと、マッチングゲームの中の一部でランダムなビープサウンドにあわせて反応して答えを返すというものです。答えられなければ点数がマイナスになります。 まず、数字をランダムに1から10の間で生成し、出た数字がある特定の数字だとビープサウンドが流れるという仕組みを考えたのですがどうでしょうか。 本当に切羽詰っています。助けてください。 // rand.cpp : Defines the entry point for the console application. // #include <stdafx.h> #include <stdlib.h> /*This header is for rand srand code)*/ int main (void) { unsigned int seed; int i,run=0; printf("Choose a level of difficulty"); scanf("%d", &seed); /*&seed is for "unsigned" int*/ printf("\n"); srand(seed); /*generate a number 0-10*/ i=1+(int) (10.0*rand()/(RAND_MAX+1.0)); /*if a number is 1, beep sound comes out*/ if(i==1) for(int j=0; j<i; j++) printf("\a"); return 0; }
- 締切済み
- C・C++・C#
- 乱数で交互に偶数、奇数が、、、。
C言語で、確率2分の1で0と1を 出そうとして、rand,srand,timeを使って やってみたのですが、ちょうど、0と1が 交互に出てしまいます。何度やっても 変わりません。ただ、1と0が逆になる だけ。こんな感じで0101010101か1010101010 つまり、乱数で奇数と偶数が 交互に発生しているみたいうまくいきません。 なにか、別の方法ありますか? --------------------------------------- srand((unsigned int)time(NULL)); s=rand()%2 これで、やってます。
- ベストアンサー
- C・C++・C#
- 型変換??
int RANDOM_FUNCTION( int n ) { return (int)( rand() / (float)RAND_MAX * n ); } について Q1.この関数は0からn-1までの乱数を作るそうなのですが,何故ですか? 0<=rand()<=RAND_MAX だから0からnまでの乱数ができるような気がするのですが. Q2.RAND_MAXではなく(float)RAND_MAXとキャストしてある意味は何ですか? Q3.srand((unsigned)time(NULL));と srand((unsigned int)time(NULL));では何か違いますか? Q4. static int first = 0; if (first == 0){ srand((unsigned)time(NULL)); first = 1; } という処理でsrand((unsigned)time(NULL));は最初の一回だけ呼び出されるようになっているようですが,この部分を srand((unsigned)time(NULL)); というように毎回呼び出すようにするとどうなりますか? 一回呼び出すだけで乱数系列の初期値が呼び出される時に変化しているのですか? Q5.この関数とは関係ない質問ですが,例えば a:int型 b:int型 c:double型 d:float型 のとき d = a / b + c という演算は 1 a:int型,b:int型より(a / b)の結果はint型(小数になった場合は小数点以下切り捨て) 2 (a / b):int型,c:double型,int<doubleより (a / b + c)の結果はdouble型 3 d:float型,『=のあるときは左辺の型に合わせる』よりdはfloat型 というように型変換されているという解釈でいいのでしょうか??
- ベストアンサー
- C・C++・C#
- 先頭0で重複のない配列を作りたい
重複なく4つの領域を持つ配列に数字を代入したい(先頭は0以外の 数字)と思って書いたプログラムです。 しかし、コンパイルしてみると重複が発生してしまいます。 これはなぜ発生してしまうのでしょうか? よろしくお願いします。 #include<stdio.h> #include<stdlib.h> #include<time.h> int main(void) { int num,val,i,j; int comp[4]; srand(time(NULL)); puts("4桁の数字を記憶して逆向きに入力しましょう。"); val=rand()%10; do{ comp[0]=val; }while(comp[0]==0); for(i=1;i<4;i++) { do{ val=rand()%10; for(j=0;j<i;j++) { if(comp[j]==val) { break; } } }while(i<j); comp[i]=val; } for(i=0;i<4;i++) { printf("%d",comp[i]); } return 0; }
- ベストアンサー
- C・C++・C#
- 乱数発生
#include <stdio.h> #include <stdlib.h> #include <time.h> int main(void) {int y, m, l; srand( (unsigned)time( NULL ) ); y=rand() % 2500 + 1600; m=rand() % 12 + 1; l=rand() % 29 + 1; printf("西暦%d年%d月%d日",y,m,l); return(0); }今回は乱数発生でランダムにだされた西暦年月日をつくりましたが、y=rand() % 2500 + 1600; というのがありこれはyという乱数が2500以下1600以上という意味なのですがなぜかプログラムを実行しても3000いくつとか4000いくつなんてのもでてきます。m=rand() % 12 + 1;はちゃんと12以下1以上でできるのですがなぜですか?本当にわかりません。是非だれか教えてください。
- ベストアンサー
- C・C++・C#
- 0から1までの乱数(実数値)を発生させるのと、ある確率の時に処理をさせたい。
1 #include <stdio.h> 2 #include <time.h> 3 #include <stdlib.h> 4 #define P 0.05 5 int main(void) 6 { 7 int abc; 8 double x; 9 srand(time(NULL)); 10 x = (double)rand()/RAND_MAX; 11 if(x > P){ 12 abc = 1; 13 } ・・・ (1)0から1までのランダムな実数値を10行目で発生させているつもりですが、あまりきざみが良くない?とこ耳にはさんだので0から1までの最もいいと思われるランダムな実数値の発生を教えてもらえないでしょうか? (2)11行目で約1/20000の確率でabcに1を代入したいのですが、上記のプログラムをどのように改良すればよろしいでしょうか? どちらか片方でもアドバイス頂ければ幸いなので、お手数ですがよろしくお願いいたします。
- ベストアンサー
- C・C++・C#
お礼
ありがとうございます!! 実行できました。 0がかぶることなくできるようになり助かりました! 文字はsubstrで1文字ずつ取り除きました。