乱数が重複
乱数が重複
code
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void *card(void){
int num,i;
char *test[13] = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
srand((unsigned)time(NULL));
num = rand() % 13;
return test[num];
}
int main (void){
char c;
char *funyu;
while(1){
printf("Hit or Stand?(h/s)¡§");
scanf("%c",&c);
if(c == 's')break;
funyu = card();
printf("%s\n",funyu);
}
return 0;
}
code
乱数が重複しないようにするにはどうすれば良いですか?
トランプのカードの種類も出さなくてはいけません。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void *card(void){
int num,i;
char *test[13] = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"};
srand((unsigned)time(NULL));
num = rand() % 13;
return test[num];
}
int main (void){
char c;
char *funyu;
while(1){
printf("Hit or Stand?(h/s)¡§");
scanf("%c",&c);
if(c == 's')break;
funyu = card();
printf("%s\n",funyu);
}
return 0;
}
code
乱数が重複しないようにするにはどうすれば良いですか?
トランプのカードの種類も出さなくてはいけません。
-
- 記事: 44
- 登録日時: 11年前
Re: 乱数が重複
乱数が重複するのは、使う乱数を決めるための関数
srand((unsigned)time(NULL));
をcard関数内で何度も呼び出しているのが原因です。
main関数内で一度だけ呼び出すようにしてみましょう。
srand((unsigned)time(NULL));
をcard関数内で何度も呼び出しているのが原因です。
main関数内で一度だけ呼び出すようにしてみましょう。
ただの超絶右留斗羅天才プログラマーです。同人ゲーム制作進捗度:7%
-
- 記事: 44
- 登録日時: 11年前
Re: 乱数が重複
一応、正常なプログラムを貼り付けておきます(*´▽`*)
どうしても分からなくなったら、スポイラーを開いて確認してみましょう。
どうしても分からなくなったら、スポイラーを開いて確認してみましょう。
► スポイラーを表示
最後に編集したユーザー 超絶右留斗羅天才プログラマー on 2013年6月21日(金) 18:14 [ 編集 1 回目 ]
ただの超絶右留斗羅天才プログラマーです。同人ゲーム制作進捗度:7%
Re: 乱数が重複
おそらくZ400FXさんが実現したいのはランダムな順列ですよね。
ちょうど良い解説を見つけました。
http://pcnetbeginners.seesaa.net/article/208460691.html
ちょうど良い解説を見つけました。
http://pcnetbeginners.seesaa.net/article/208460691.html
Re: 乱数が重複
それを実現するのがランダムな順列です。Z400FX さんが書きました:1度引いたカードはその実行中には2度と出てこないようにしたいのです。
-
- 記事: 44
- 登録日時: 11年前
Re: 乱数が重複
先程は失礼致しました。
以下を全て直すと実現できます。
①scanfの内容をscanf("%s",&c);に直しておきます。
②card関数の戻り値をchar型とします。
③funyuの変数をchar型とします。
④card関数に新しくstatic int型の変数を一つ用意し、初期値を13とします。
⑤card関数のtestをchar型にし、"1"とくくっていたものを'1'と全て直します。
⑥num=rand() % maxと変更します。
⑦戻り値を保持するchar型変数にtest[num]を保持します。
⑧一度選んだものを潰すために、for文を回します。
⑨maxの値を一つ引きます。
⑩保持しておいたものをreturnします。
⑪13回以上引くとエラーが起きるので、13回以降は'\0'をreturnします。
コードは以下のようになります。
以下を全て直すと実現できます。
①scanfの内容をscanf("%s",&c);に直しておきます。
②card関数の戻り値をchar型とします。
③funyuの変数をchar型とします。
④card関数に新しくstatic int型の変数を一つ用意し、初期値を13とします。
⑤card関数のtestをchar型にし、"1"とくくっていたものを'1'と全て直します。
⑥num=rand() % maxと変更します。
⑦戻り値を保持するchar型変数にtest[num]を保持します。
⑧一度選んだものを潰すために、for文を回します。
⑨maxの値を一つ引きます。
⑩保持しておいたものをreturnします。
⑪13回以上引くとエラーが起きるので、13回以降は'\0'をreturnします。
コードは以下のようになります。
► スポイラーを表示
ただの超絶右留斗羅天才プログラマーです。同人ゲーム制作進捗度:7%
Re: 乱数が重複
他のトピックと酷似しているようですが,
こっちではスートの概念がない(1~13の13枚しかカードがない)ということでいいのかな?
http://dixq.net/forum/viewtopic.php?f=3&t=13282
forで回さずとも1要素だけ動かせば良いように思います.
こっちではスートの概念がない(1~13の13枚しかカードがない)ということでいいのかな?
http://dixq.net/forum/viewtopic.php?f=3&t=13282
forで回さずとも1要素だけ動かせば良いように思います.
Re: 乱数が重複
自分が昔書いたライブラリ(をC言語に移植したもの)を貼っておきます。
移植元のC++のコードはここにあります。
http://dixq.net/forum/blog.php?u=536&b=3091
► スポイラーを表示
http://dixq.net/forum/blog.php?u=536&b=3091
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)
-
- 記事: 44
- 登録日時: 11年前
Re: 乱数が重複
シングルクォーテーションでくくると、何故か文字化けしてしまうのですよね(ノ_・;)
⑤と⑪に該当する部分ですので、元のプログラムを元に変更してください。
他に文字化けしている所も、元のプログラムを参照してください。
⑤と⑪に該当する部分ですので、元のプログラムを元に変更してください。
他に文字化けしている所も、元のプログラムを参照してください。
ただの超絶右留斗羅天才プログラマーです。同人ゲーム制作進捗度:7%
Re: 乱数が重複
トランプのカードを1 枚ひく(カードのスーツと数字を返す) 関数を作れ。1, 11, 12, 13 につい
ては、それぞれA, J, Q, K と表示させること。スペード、ハート、ダイヤ、クラブについては、そ
れぞれS, H, D, C と表示させること。また、トランプは1 組だけ使用するものとし、同じカード
が重複してひかれることは許されない。さらに、プログラムを実行し直すたびに、異なるカード
が出るようにすること。
/*
// トランプを引くプログラム
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//トランプを引く処理
void *pull(void){
int rand_cards,rand_suit; //乱数を格納する変数
int suit[4] = {1,2,3,4}; //トランプの絵柄
char *cards[13] = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"}; //トランプの数字
srand((unsigned)time(NULL)); //乱数を初期化する。この処理がないと乱数が初期化されずに同じ結果がでる。
rand_suit = rand() % 4; //乱数を生成してスートを決めて変数に格納する。
srand((unsigned)time(NULL));
rand_cards = rand() % 13; //乱数を生成して数字を決めて変数に格納する。
printf("%d%s\n",suit[rand_suit],cards[rand_cards]); //結果を表示
}
int main(void){
char c;
while(1){ //無限ループ
printf("Hit or Stand?(h/s):");
scanf(" %c",&c);
if(c == 's')break;
pull();
}
return 0;
}
あれから考えてみましたが、やはり分かりません。
ては、それぞれA, J, Q, K と表示させること。スペード、ハート、ダイヤ、クラブについては、そ
れぞれS, H, D, C と表示させること。また、トランプは1 組だけ使用するものとし、同じカード
が重複してひかれることは許されない。さらに、プログラムを実行し直すたびに、異なるカード
が出るようにすること。
/*
// トランプを引くプログラム
*/
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
//トランプを引く処理
void *pull(void){
int rand_cards,rand_suit; //乱数を格納する変数
int suit[4] = {1,2,3,4}; //トランプの絵柄
char *cards[13] = {"A","2","3","4","5","6","7","8","9","10","J","Q","K"}; //トランプの数字
srand((unsigned)time(NULL)); //乱数を初期化する。この処理がないと乱数が初期化されずに同じ結果がでる。
rand_suit = rand() % 4; //乱数を生成してスートを決めて変数に格納する。
srand((unsigned)time(NULL));
rand_cards = rand() % 13; //乱数を生成して数字を決めて変数に格納する。
printf("%d%s\n",suit[rand_suit],cards[rand_cards]); //結果を表示
}
int main(void){
char c;
while(1){ //無限ループ
printf("Hit or Stand?(h/s):");
scanf(" %c",&c);
if(c == 's')break;
pull();
}
return 0;
}
あれから考えてみましたが、やはり分かりません。
Re: 乱数が重複
>int suit[4]={1,2,3,4};のところをD,S,Q,Hにしたいのですが、どうすれば良いですか?
>ちなみにchar型にしても出来ません。
意味がわかりません.
char suit[4] = { 'D', 'S', 'Q', 'H' };
とか書きたいのでしょうか?
>52回
>有限ループがわかりません・・・。
あなた自身が「無限ループ」を書いて,ユーザ入力の結果によって終了するようにコードを書いているのですが…??
一定回数だけ繰り返したいのであれば,そのように書くだけだと思いますが.
「一定回数繰り返させる書き方がわからない」とかいう話なのであれば…さすがに回答しがたいです.
(この課題に挑む前にまずはCを一から勉強してください,としか言えない)
>ちなみにchar型にしても出来ません。
意味がわかりません.
char suit[4] = { 'D', 'S', 'Q', 'H' };
とか書きたいのでしょうか?
>52回
>有限ループがわかりません・・・。
あなた自身が「無限ループ」を書いて,ユーザ入力の結果によって終了するようにコードを書いているのですが…??
一定回数だけ繰り返したいのであれば,そのように書くだけだと思いますが.
「一定回数繰り返させる書き方がわからない」とかいう話なのであれば…さすがに回答しがたいです.
(この課題に挑む前にまずはCを一から勉強してください,としか言えない)
-
- 記事: 44
- 登録日時: 11年前
- softya(ソフト屋)
- 副管理人
- 記事: 11677
- 登録日時: 13年前
- 住所: 東海地方
- 連絡を取る:
Re: 乱数が重複
傍観してましたが、超絶右留斗羅天才プログラマーさんが他の人のやっていることを台無しにしそうなのでコメントさせていただきました。
面倒でしょうが、答えに誘導する形での回答をお願いします。
どうしても、直接的なコードが必要だと思うのならプレイベートメッセージで他の人に確認をとるとか協調をお願いします。
【補足】あっ、私に強制権はありませんのでお願いになります。
面倒でしょうが、答えに誘導する形での回答をお願いします。
どうしても、直接的なコードが必要だと思うのならプレイベートメッセージで他の人に確認をとるとか協調をお願いします。
【補足】あっ、私に強制権はありませんのでお願いになります。
by softya(ソフト屋) 方針:私は仕組み・考え方を理解して欲しいので直接的なコードを回答することはまれですので、すぐコードがほしい方はその旨をご明記下さい。私以外の方と交代したいと思います(代わりの方がいる保証は出来かねます)。