質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Q&A

解決済

1回答

1595閲覧

確率、乱数分布を再現したい

dskn1121

総合スコア26

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

0グッド

0クリップ

投稿2016/09/28 04:37

###前提・実現したいこと
学校で現在armadilloを使った組込み課題をやっています。
わたしは1000円自販機を再現しようとプログラムを組んでいますが難しく、手詰まりの状態です。

確率を設けて豪華な賞品には低い確率を設けたいのですがどこにどういれていけばいいかわかりません。
最悪、乱数でやりますがその辺をぜひ教えてください、お願いします。

###該当のソースコード

C

1このメイン文を改造して実現させたいのでお力添えよろしくお願いします。 2 3int main(void) { 4 int fd; 5 int i; 6 int a; 7 int ret; 8 struct tsdev *ts; 9 struct ts_sample samp; 10 int enable = 1; 11 int led_state = 0; 12 13 int tmp; 14 15 // フレームバッファをオープンします。 16 // オープンに失敗した場合はエラーで終了します。 17 if ((fd = open(FBDEV_FILE, O_RDWR)) < 0) { 18 perror("open(fb)"); 19 return 1; 20 } 21 22 // mmapによりバッファの先頭アドレスを取得します。 23 pfb = mmap(0, SCREENSIZE, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); 24 // 取得に失敗した場合はエラーで終了します。 25 if (pfb == MAP_FAILED){ 26 perror("mmap"); 27 return 1; 28 } 29 30 // LCDの画面表示を全て消去するために、 31 // 取得したアドレスから確保領域を0で初期化します。 32 for (i = 0; i < SCREENSIZE / BYTES_PER_PIXCEL; i++) 33 pfb[i] = 0; 34 35 // タッチスクリーンイベントファイルをオープンします。 36 ts = ts_open(TSDEV_FILE, 0); 37 // オープンに失敗した場合はエラーで終了します。 38 if (!ts){ 39 perror("ts_open"); 40 return 1; 41 } 42 43 // コンフィグファイルを読み込み、フィルタモジュールをロードします。 44 ret = ts_config(ts); 45 // ロードに失敗した場合はエラーで終了します。 46 if (ret){ 47 perror("ts_config"); 48 return 1; 49 } 50 51 52 53 // 画像データを読み込み、ボタンのカラーデータを取得します。 54 if (ret = load_bmp()) 55 return ret; 56///////////////////////////////////////////////// 57 // LCDに各種ボタンを表示します。 58// update_button(BTN_deru, BTN_kieru); 59 60 61 update_button(BTN_LIGHT1, BTN_OFF); 62 update_button(BTN_LIGHT2, BTN_OFF); 63 update_button(BTN_LIGHT3, BTN_OFF); 64 update_button(BTN_LIGHT4, BTN_OFF); 65 update_button(BTN_LIGHT5, BTN_OFF); 66 update_button(BTN_LIGHT6, BTN_OFF); 67 update_button(BTN_LIGHT7, BTN_OFF); 68 update_button(BTN_LIGHT8, BTN_OFF); 69 70 71////////////////////////////////////////////////// 72 73 74 // タッチスクリーンイベントを受け付ける間ループさせます。 75 for(;;){ 76 // タッチスクリーンイベントから、圧力・x座標・y座標を読み込みます。 77 ret = ts_read(ts, &samp, 1); 78 // 読み込みに失敗した場合はエラーで終了します。 79 if (ret < 0){ 80 perror("ts_read"); 81 return 1; 82 } 83 84 // タッチイベントが1個以外の場合は無視します。 85 if (ret != 1) 86 continue; 87 88 // 圧力がなくなったら、次に圧力がかかった初回のみ処理を実行するように、 89 // enable に 1を設定します。 90 if (samp.pressure == 0){ 91 enable = 1; 92 continue; 93 } 94 95 96 97//////////////////////////////////////////////////////////////////////////////////////////////// 98 99 100 // タッチされたボタンに該当する処理を実行します。 101 if (enable){ 102 // タッチされた座標を調べ、識別子を取得します。 103 ret = xy2button(samp.x, samp.y); 104 105 106/* while(0){ 107 //ランダムに画像を出す処理 108 109 } 110*/ 111 112 113//////////////////////////////////////////////////////////////////////////////////////////////////// 114 115 // 識別子によって処理を変えます。 116 switch(ret){ 117 118 119 // 画像を出す処理 120 case BTN_LIGHT1 : 121 // 対象のLEDを点灯させるために、立てるビットを算出します。 122 tmp = ret - BTN_LIGHT1; 123 // 対象のLEDが点灯か消灯かを判定します。 124 if (led_state & (1 << tmp)){ 125 // 点灯していた場合はOFFボタンを表示します。 126 update_button(ret, BTN_OFF); 127 // タッチされたボタンに対応するLEDの対象ビットを落とします。 128 led_state &= ~(1 << tmp); 129 // 落としたビットを反映し、対象のLEDを消灯します。 130 change_led(led_state); 131 } else { 132 // 消灯していた場合はONボタンを表示します。 133 update_button(ret, BTN_ON); 134 // タッチされたボタンに対応するLEDの対象ビットを立てます。 135 led_state |= 1 << tmp; 136 // 立てたビットを反映し、対象のLEDを点灯します。 137 change_led(led_state); 138 } 139 break; 140 141 142 case BTN_LIGHT2 : 143 // 対象のLEDを点灯させるために、立てるビットを算出します。 144 tmp = ret - BTN_LIGHT1; 145 // 対象のLEDが点灯か消灯かを判定します。 146 if (led_state & (1 << tmp)){ 147 // 点灯していた場合はOFFボタンを表示します。 148 update_button(ret, BTN_OFF); 149 // タッチされたボタンに対応するLEDの対象ビットを落とします。 150 led_state &= ~(1 << tmp); 151 // 落としたビットを反映し、対象のLEDを消灯します。 152 change_led(led_state); 153 } else { 154 // 消灯していた場合はONボタンを表示します。 155 update_button(ret, BTN_ON); 156 // タッチされたボタンに対応するLEDの対象ビットを立てます。 157 led_state |= 1 << tmp; 158 // 立てたビットを反映し、対象のLEDを点灯します。 159 change_led(led_state); 160 } 161 break; 162 163 164 165 case BTN_LIGHT3 : 166 // 対象のLEDを点灯させるために、立てるビットを算出します。 167 tmp = ret - BTN_LIGHT1; 168 // 対象のLEDが点灯か消灯かを判定します。 169 if (led_state & (1 << tmp)){ 170 // 点灯していた場合はOFFボタンを表示します。 171 update_button(ret, BTN_OFF); 172 // タッチされたボタンに対応するLEDの対象ビットを落とします。 173 led_state &= ~(1 << tmp); 174 // 落としたビットを反映し、対象のLEDを消灯します。 175 change_led(led_state); 176 } else { 177 // 消灯していた場合はONボタンを表示します。 178 update_button(ret, BTN_ON); 179 // タッチされたボタンに対応するLEDの対象ビットを立てます。 180 led_state |= 1 << tmp; 181 // 立てたビットを反映し、対象のLEDを点灯します。 182 change_led(led_state); 183 } 184 break; 185 186 187 188 // 圧力がなくなるまで、同じ処理をしないように 189 // enableに0を設定します。 190 enable = 0; 191 } 192 } 193 194 195 // タッチスクリーンイベントファイルをクローズします。 196 ts_close(ts); 197 // フレームバッファのために確保した領域を開放します。 198 munmap(pfb, SCREENSIZE); 199 // フレームバッファをクローズします。 200 close(fd); 201 202 return 0; 203 204//関数の紹介 205 206// ビットマップ形式の画像ファイルを読み込み、 207// ボタンのカラーデータを取得する関数。 208int load_bmp(void) 209 210// LCDに画像を表示する関数。 211void draw_image(int index, int x0, int y0) 212 213// ボタンを表示する関数。 214void update_button(int index, int on) 215 216// 座標に対応するボタン識別子を返す関数。 217int xy2button(int x, int y)

###補足情報(言語/FW/ツール等のバージョンなど)
C言語 Linux

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下、実際にどうだかはわかりませんが、参考になると思います。
自販機の当たりプログラム組んだことある俺が仕組み教えてやる

「1000円自販機」ということであれば、当然赤字にならないようにということで、次のようなロジックになるかと思います。
上のリンクにある日数判定も入れるのも手ですよね。

100円の景品:毎回
500円の景品:5回に一度
1000円の景品:10回に一度
10000円の景品:100回に一度

ロジックを決めて、それを実装するだけで、乱数による抽選は不要かと思います。

投稿2016/09/28 09:13

moonphase

総合スコア6621

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問