メモリを動的確保する関数の作成について(C言語)

妻のブログの方では既に報告されているが、家を建てることにした。
子供が産まれてアパートが手狭になったことがきっかけだ。
ずっと賃貸暮らしを続ける予定だったのだが、それなりの広さがあって猫okという物件はそれほどないだろうということで決断した。
住宅に関しては知らないことだらけで色々勉強した。
住宅ローンについても少し勉強した。
月々の返済額の計算法くらい知らないと恥ずかしくて銀行の担当者に会えない!と思って計算してみたりした。
ハウスメーカーの担当者の方が電卓で簡単に計算していたので簡単だと思ったら結構ややこしかった。
というか数百乗を計算しなければならないので普通の電卓ではほぼ無理だ。
関数電卓ならいける。ハウスメーカーの方が使っていたのはローン計算機能付きの電卓だったようだ。
住宅ローン控除や繰り上げ返済を考慮した簡単なローンシミュレータも作った。
シミュレータについては公開予定なし。
月々の返済額の公式の導出はupする予定。僕がupしなくてもどっかにあると思うけど。
シミュレータは今のところ固定金利で計算しているので変動金利にも対応させる予定。
乱数を入れてシミュレーションすると面白そう。

////////////////////////
時々メモリを動的確保する関数はどういう風に書けばいいのか迷うことがあるのでここでまとめておく。
次のようなことは出来ない。

#include <stdio.h>
#include <stdlib.h>
#define N 10

void f(int *a)
{
    a = (int*)malloc(sizeof(int)*N);
}

int main()
{
    int *a;
    f(a);
    return 0;
}

main関数のint *aは最初どこも指していない。
main::a->?
これが関数fの引数として渡されるとmain::aと同じアドレスを
指すf::aが生成される。
main::a->?
f::a->?
関数fの中でmallocすると
main::a->?
f::a->確保された領域の先頭アドレス
結局main::aは不定アドレスを指したまま。

ではどうしたらよいか。次のようにすればよい。

#include <stdio.h>
#include <stdlib.h>
#define N 10

void f(int **a)
{
    *a = (int*)malloc(sizeof(int)*N);
}

int main()
{
    int *a;
    f(&a);
    free(a);
    return 0;
}

最初は
main::a->?
f関数にmain::aのアドレスを引数として渡せば
f::a->&(main::a)

もしくは次のようにする。
#include <stdio.h>
#include <stdlib.h>
#define N 10

int* f()
{
    int *a = (int*)malloc(sizeof(int)*N);
    return a;
}

int main()
{
    int *a;
    a = f();
    free(a);
    return 0;
}

f::a->領域確保された先頭アドレス
return aすると領域確保された先頭アドレスが戻る。
f::a自体は解放されてしまうがその前にmain::aに
領域確保された先頭アドレスが格納されるので問題ない。
ジャジャガッチ | C/C++ | 21:43 | comments(0) | trackbacks(0) |

スマホのゲームでガチャは何回まわす必要があるのか

最近は家族3人で近くの川に鴨を見に行くのが楽しみだ。
それでこの前妻が鴨の柄のキーケースをプレゼントしてくれた。これは嬉しい。癒される。
僕のお気に入りだ。
ちなみに僕の財布にははしっこにペンギンがいる。これも妻からのプレゼントだ。
30歳だけど・・・、いいよね!

///////////////////////////////////////////
巷ではずいぶん前からスマホのゲームが流行っている。
これらのゲームにはよくガチャというシステムが導入されているらしい。
これはある確率でレアアイテムが入手できるくじだ。
さて、一回あたりの当選確率pがわかっているとき、何回ガチャを回せば目的のアイテムが手に入るだろう。

時々勘違いされているのは例えば当選確率5パーセントなら20回引けば100パーセント当たる、という考え方。
これは大間違い。
計算してみると、当選確率が低い場合は当選確率によらず約63パーセントとなる。
上の例における20回(=1/p)を想定回数と呼ぶことにするとpが小さいとき、90パーセントの確率で当選するためには想定回数の2.3倍ガチャを回す必要がある。
この2.3は
-ln(1-0.9)~2.3からきている。
もっと安全に95パーセントで当てたければ
-ln(1-0.95)~3
より想定回数の3倍が必要だ。同様に99パーセントなら4.6倍が必要となる。
ガチャを回すときは想定している回数の2倍程度は回す覚悟が必要になるということだ。
詳しい計算はこちら→gacha.pdf
計算間違い、考え違いがあれば教えてください。
 
ジャジャガッチ | 数学 | 21:09 | comments(0) | trackbacks(0) |
1/1PAGES | |

09
--
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
--
>>
<<
--
PR
RECOMMEND
RECENT COMMENT
MOBILE
qrcode
OTHERS
Since 2013/09/17
LATEST ENTRY
CATEGORY
ARCHIVE
LINKS
PROFILE
SEARCH