【学習用に、面白くて単純な関数を募集】

来週、学生にJavaScriptで引数や戻り値を持つ関数を教えます。BMI値計算や、消費税計算でもいいのですが、どうせでしたら「面白い」関数にしたいと思います。それほど複雑な式ではなく、(事前に予測が難しいという意味で)面白い結果が出てくるような関数を教えていただけないでしょうか?

たとえば、あるサッカーのスコアが m対n (m>=n) であったとき、試合中に一度も、勝ったチームが、負けたチームと同点になったシーンがない、いわば「ワンサイドゲーム」であった確率は (m-n)/(m+n) というのは、なかなか面白いと思います。

なお、再帰関数はダメです。できれば関数内にfor文やwhile文、if文も含まないで下さい。よろしくお願いいたします。

回答の条件
  • 1人5回まで
  • 登録:
  • 終了:2014/12/02 16:07:41
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:sokyo No.9

回答回数1377ベストアンサー獲得回数97

ポイント50pt

関数といえばケータイの料金に決まってるじゃないですか!

http://www.au.kddi.com/mobile/charge/smartphone/lte-plan/
http://www.au.kddi.com/mobile/charge/basic-charge/lte-v/
たとえば、auのLTEプランは、通話料が従量制になっています。
話を単純にするために、通話以外の基本使用料とパケット通信料を定額とすると、
通話料だけが変数の1次関数になります。
これなら単純といえませんか??

基本使用料を「誰でも割」適用の934円、
パケット通信料をLTEフラット(V)適用の5700円、
ネット接続サービスLTE NETが300円で、
それ以外のお金はかからないとします。
合計の料金をy(円)、通話時間をx(分)とすると、
y=934+5700+300+40*x

って感じになります(実際の料金と違ったらごめんなさい…)。

http://www.au.kddi.com/mobile/charge/smartphone/
auには
通話し放題のプランもあるので、どれぐらい通話する人はどちかがトクになるか、
関数の比較でわかりますね!

あとは誕生日の関係の問題だとどうですか?
http://ja.wikipedia.org/wiki/%E8%AA%95%E7%94%9F%E6%97%A5%E3%81%AE%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9
誕生日のパラドックスが絶対いいと思うんですが、それがもし難しすぎるなら
n人の集団の中に自分と同じ誕生日の人がいる確率、はどうでしょうか。

確率をp、人数をnとするとき、n人の集団の中に自分と同じ誕生日の人がいる確率は
p=1-(364/365)^n

となります。累乗はNGですかね…。

http://keisan.casio.jp/exec/system/1161228814
でもこのサイトだとオンラインでその計算をしてくれます。
自分で組み立てられなくても、味わって楽しむこともできるのではないでしょうか。

http://ja.wikipedia.org/wiki/%E7%B4%99%E3%81%AE%E5%AF%B8%E6%B3%95
Wikipediaには「紙の寸法」という記事があり、
ここにAnの長辺のサイズを求める式が出ています。
nに4を入れるとA4の長辺のサイズがわかります!
でも床関数とかNGなんですよね…。

http://www.tenki.jp/indexes/cough/
それと、風邪ひき指数というものがあり、
これを気温と湿度から算出できないかなと思ったのですが、
どうも指数のはじき出し方は見つけられませんでした。
気象関係の関数は楽しそうだと思ったのですが、なかなか難しいです。
http://homepage2.nifty.com/luminaries/guidance/kishou_018.htm
不快指数は式が見つかりましたが、季節外れですね…。

http://keisan.casio.jp/
話は戻りますが、こちらのサイトはどれも楽しくて応用が効きそうです。
http://keisan.casio.jp/exec/system/1373508428
このへんは特に身近で良さそう。
私はHTMLとか読めないんですが、内部JavaScriptで動いてたりしたら活用できますね。

まとまりのない回答ですが、いかがでしょうか。

id:lionfan2

sokyo様、まとまりがないどろか、むしろきれいにまとめていただき、ありがとうございます!!
携帯関数とか、同じ誕生日関数は、どちらも良さそうです。
ことに携帯は、学生ウケが良さそうですね。ありがとうございます!!

2014/11/29 23:13:01

その他の回答8件)

id:taddy_frog No.1

回答回数832ベストアンサー獲得回数83

ポイント5pt

2の3乗は8 → pow(2,3)
8の3乗根は2 → pow(8,(1/3))
log8÷log2は3 → log(8)/log(2)

面白くは無いですけど、
これが切っ掛けで、
数学を好きになる人がいるかも知れません。



http://webgaku.hateblo.jp/entry/20120620/1340125992
↑金利計算です。


秒速30メートルのボールを、
50度の角度で投げた時、
三秒後の高さは、

30*3*sin(50)-0.5*9.8*3
答えは24.844メートルです。
9.8は、重力加速度です。

3秒後の距離は、
30*cos(50)*3です。

JavaScriptは、角度の単位がラジアンなので、
度をラジアンにする時は、度/180*3.14=ラジアン
ラジアンを度にする時は、ラジアン/3.14*180=度
です。

id:lionfan2

サディア・ラボン様、すみません、この程度ではダメです。
powとかlogとか、初心者には小難しい割には、特に数式に面白い意味もないので。
まだしも pow で金利計算とか提案して下さい。

2014/11/27 21:32:19
id:lionfan2

サディア・ラボン様、追加の数式、了解です。ありがとうございます。

2014/11/28 00:47:43
id:a-kuma3 No.2

回答回数4973ベストアンサー獲得回数2154

ポイント15pt

普通、っちゃあ、普通かもしれませんが、ふたつほど。

1からある数字までの自然数の総和

¥sum_{k=1}^{n} _k  = ¥frac{n(n+1)}{2}

想定内だとは思いますが、単純な式でもいける、for ループで計算するのも善し。
関数の中がどのような実装になっていても、呼ぶ側からは、中身を気にしないで呼べるのだ、という流れで。

春分の日、秋分の日の求め方

D = ¥left[ 20.8431+0.242194 (Y-1980) - ¥left[ ¥frac{Y-1980}{4} ¥right¥] ¥right¥]
http://www.h3.dion.ne.jp/~sakatsu/holiday_topic.htm#syunbun

3月20日か21日のどちらかを求めるだけなのに、大げさだねえ、と。
ガウス記号のところは、Math.ceilで求めます。

id:lionfan2

a-kuma3様、いつもありがとうございます。
「春分の日、秋分の日の求め方」は、やや面白いと思いました。

2014/11/28 00:50:34
id:grankoyan2

閏年を求める式は簡単だけど妙に奥が深くて好きでした。

2014/11/28 16:12:46
id:MIYADO No.3

回答回数1059ベストアンサー獲得回数194

ポイント20pt

指数関数が急速に大きくなることは、ネズミ講の被害者にとっては「事前に予測が難しい」と思います。

それから、指数関数の身近に使われている例として

2^0=1
2^1=2
2^(1+7/12)≒3
2^2=4
2^(2+4/12)≒5
2^(2+7/12)≒6

というのがあります。
どこで使われているでしょうか。

他4件のコメントを見る
id:MIYADO

==========解答編-==========
これは音楽で言う音の高さと物理で言う音の高さとの関係です。
基準とする音をドとすると、
 オクターブ上のドは周波数が2^1=2倍
 その上のソは周波数が2^(1+7/12)≒3倍
 その上のドは周波数が2^2=4倍
 その上のミは周波数が2^(2+4/12)≒5倍
 その上のソは周波数が2^(2+7/12)≒6倍
となります。正確にはここの左辺のようにする方式を平均律と言います。なお平均律にするとドミソの周波数が簡単な整数比からちょっとずれますから厳密には不協和音になります。通常、ピアノもギターも平均律なので厳密には不協和音です。まず気づきませんが。ドミソとドファラとシレソの周波数が簡単な整数比になるように調律するのを純正律と言いますが、これをやると調が変わると調律し直さなければならなくなります。
なおこの逆数をとったものがギターであればフレットの位置です。ですからその図を描かせたのです。
==========解答編・終わり==========

2014/12/02 16:39:56
id:lionfan2

みやど様

ありがとうございます。音楽にはうといもので、結局、これだけヒントいただきながら分かりませんでした・・・。お恥ずかしい。

2014/12/02 16:47:03
id:takejin No.4

回答回数1543ベストアンサー獲得回数203スマートフォンから投稿

ポイント15pt

いま、数式がみちびけていませんが、
生年月日関連 :日付を入れると曜日が返る。太陰暦、旧暦(江戸時代を継続)の日付。
時刻関連:江戸時刻を返す(不定時法による今何時だい)

太陽系突入速度と突入角度による、最終到達地点:太陽に飛び込む、どこかの軌道におさまる、無限遠に捨てられる。

二拓、三拓:関数軌道時のクロックの一秒未満部分が~0.5なら選択1、それ以外なら選択2を返す。スーパーランダム関数。返る選択数を変更できると面白いかも。

マンデルブロー関数値を返す:座標(xy)を入力すると、そのポイントの繰り返し回数を返す。
ポイントが微小にずれるだけで、返り値が大きく異なる部分がある。また、これを使って、マンデルブロー図形を書くこともできる。

などと考えてみました。時間があれば、関数化してみます。

id:lionfan2

takejin様、ありがとうございます。
ただ、これはたいへん申し訳ないのですが、難しすぎるか、学生の興味を真に惹くものではないと感じました。

ただでさえ関数は難しい単元ですので、内容的には面白くても、数式は小学校レベルのシンプルさが良いのです。

「たとえば年利r%で借りると借金が2倍になる年数の近似式は 72/r」などです。

2014/11/28 18:33:37
id:nakaken88888888 No.5

回答回数3ベストアンサー獲得回数1

ポイント15pt

「ツェラーの公式」とかいいんじゃないでしょうかね。

http://ja.wikipedia.org/wiki/%E3%83%84%E3%82%A7%E3%83%A9%E3%83%BC%E3%81%AE%E5%85%AC%E5%BC%8F

日付から曜日をとってくる関数で、「生まれた日は何曜日か」を調べたり、事件のあった日や記念日なんかの曜日を調べるのにも使えます。また、javascriptであれば、今後の講義でカレンダーを作ったりすればこの内容も活かせますし、講義でやらなくても「カレンダーのような応用例もある」と触れるだけでも面白いと思います。Math.floorを使わないといけないのが、ちょっとネックかもしれませんけども。

他6件のコメントを見る
id:lionfan2

Lhankor_Mhy様、失礼いたしました。勘違いでした。
ナカケン88様、了解です。設定を変えて、何回か書き込めるようにします。

2014/11/28 19:24:18
id:lionfan2

今回は条件がきついのはわかっております。
ただ例年、関数は「f(n)=2*n」程度でも、だいぶ難しいみたいなのです。
なので、本質でないところでは、できるだけシンプルな数式で、
でもさすがに「無意味な例題をやらされている」感のないものが欲しいのです。

自分の当初の考えは、引数1つなら消費税計算(税率固定)、引数2つなら税率可変の消費税計算か、BMIです。
ただBMIは、体型を気にする学生もおりますので、あまり好ましくないと思っております。

2014/11/28 19:32:54
id:Lhankor_Mhy No.6

回答回数814ベストアンサー獲得回数232

ポイント20pt

 多角形の頂点座標の配列を引数に渡すと、面積を返す関数。

//靴紐公式
function ShoelaceFormula(arr){
  return Math.abs(arr.reduce(function(prev, current, i, arr){
    next = ( (i+1) == arr.length ) ? 0 : i+1;
    return prev + arr[i][0] * arr[next][1] - arr[next][0] * arr[i][1];
  }, 0)) / 2;
  //こ、これはreduceメソッドと三項演算子なんだからね! ifとかforじゃないんだから、勘違いしないでよね!
}

// 直角二等辺三角形の面積
alert( ShoelaceFormula( [
  [0,0],
  [1,0],
  [0,1],
]));
// 0.5

 
 ローン支払い計算関数

//pmt 支払
//pv 現在価値
//n 支払回数
//i 利率
//fv 将来価値
//type 0=期末払い(デフォルト)、1=期首払い

function pmt(args){
  var pv = args["pv"];
  var n = args["n"];
  var i = args["i"];
  var fv = args["fv"] ? args["fv"] : 0;
  var type = args["type"] ? 1 : 0;

  return ( (-pv-fv*Math.pow(1+i, -n))*i ) / ( ( 1+i*type )*( 1-Math.pow(1+i, -n) ) );
}

// 1000万円を年利3%15年払いでローン計算
alert( pmt({
  pv:10000000,
  n:12*15,
  i:0.03/12
})); 
// -69058.16402779998

 
 
 
 ちょっと不動産屋色を出してみました。

他1件のコメントを見る
id:Lhankor_Mhy

じゃあ、ものすごく簡単なやつを。

物件価格に3/1000をかけると、35年ローン金利1.4%の月額支払い額が概算できるんです。

不動産屋が「せんみつや」と呼ばれる理由 - 不動産屋のラノベ読み
2014/11/28 18:47:34
id:lionfan2

おお、これはなかなか良いと思いました。
(ただ、大学生だと「家を買う」というのが、まだリアルに実感できにくい、というところがわずかに減点)

2014/11/28 19:27:35
id:nakaken88888888 No.7

回答回数3ベストアンサー獲得回数1

ポイント25pt

宝くじの期待値を返す、というのはどうでしょう?

引数をどうするかはいろいろあると思うんですが、例えば、引数を一等賞金とし、当選金額の期待値を返す、というのはどうでしょうか。最近宝くじの一等賞金がどんどん上がってきてるので、それに応じて期待値がどうなってるかみてみる、と。2等以下はざっくりでもいいので考慮しておくと、ぱっと見て結果はわからないんじゃないかなぁと思います。計算してないのでおもしろい結果になるかわかりませんが。

id:lionfan2

了解です。ありがとうございます!!

この宝くじの「当たらなさ」については、さまざまな表現が可能です。1等をあてる確率より宝くじを買った翌日に車にはねられて死ぬ確率のほうが高い、とか。1等をあてるよりモーニング娘になるほうが簡単だ、とか。中でも私が白眉だと思う表現は、東京からフィリピンまでの「幅」(長さじゃないですよ)があるボウリング場の、どこかのレーンのむこうに1本だけピンが立っていて、それを目隠し状態で倒す確率と同じ、というやつです。

http://d.hatena.ne.jp/MrJohnny/20060630

は実感させたいですね!!

2014/11/29 02:22:40
id:MIYADO No.8

回答回数1059ベストアンサー獲得回数194

ポイント25pt

年複利利回りρで残存t年の割引債の価格(実務上100円あたりを指す)
100(1+ρ)^{-t}

別な利回りを使いたければ式をちょっと直します。なお利付債だと「どういう利回りか」という問題がかなり重要になってくるので簡単のためここでは割引債とします。

これだけだと余り面白くないかもしれませんが、次のようなことを考えましょう。

F吉、公社債を買う。
その後、金利相場暴騰する。
F吉、時価売却する。
F吉は損する。金利相場が暴騰したのに納得がいかないという。

F吉を説得しましょう。

他3件のコメントを見る
id:MIYADO

なお逆に、個人向け国債の中途換金は時価売却と違い、あらかじめ決められた方式でできます。しかし普通の公社債はそんなことはできません。

2014/12/01 14:30:31
id:MIYADO

ちょっと訂正 常識→上式
訂正後のもの

==========解答編-==========
転換権等のない普通の公社債を想定します。なお実際は以下のような長期債は割引債でなく利付債として出ています。利付債でも理屈は本質的に同じことですが、断ったように「どういう利回りか」という問題がかなり重要になってきます。

仮にt=5年で利回り0.1%(ρ=0.001)とすると、割引債価格は上式に代入すると100×1.001^(-5)=99.50…となります。それで、この割引債を買った直後に金利相場が10%(ρ=0.1)に暴騰したとします。そこで時価売却することを考えましょう。ここで時価売却というのは投資家どうしの取引であって発行者とは関係がなく、預金の中途解約とは異なるということに注意しなければなりません。この債券を売るのに99.50円で買主は買いたいと思いますか。その金額だと利回り0.1%にしかなりません。そんな物は馬鹿馬鹿しくてとても買う気にはなれません。今や相場が10%になったのですから、上の式にρ=0.1を代入した値でないと買主は妥当な金額とは思いません。その値は62.09…ですから、相場相応の価格は暴落するわけです。買主の立場に立って考えれば、預金の中途解約とは異なることが分かると思います。
==========解答編・終わり==========

2014/12/04 17:24:23
id:sokyo No.9

回答回数1377ベストアンサー獲得回数97ここでベストアンサー

ポイント50pt

関数といえばケータイの料金に決まってるじゃないですか!

http://www.au.kddi.com/mobile/charge/smartphone/lte-plan/
http://www.au.kddi.com/mobile/charge/basic-charge/lte-v/
たとえば、auのLTEプランは、通話料が従量制になっています。
話を単純にするために、通話以外の基本使用料とパケット通信料を定額とすると、
通話料だけが変数の1次関数になります。
これなら単純といえませんか??

基本使用料を「誰でも割」適用の934円、
パケット通信料をLTEフラット(V)適用の5700円、
ネット接続サービスLTE NETが300円で、
それ以外のお金はかからないとします。
合計の料金をy(円)、通話時間をx(分)とすると、
y=934+5700+300+40*x

って感じになります(実際の料金と違ったらごめんなさい…)。

http://www.au.kddi.com/mobile/charge/smartphone/
auには
通話し放題のプランもあるので、どれぐらい通話する人はどちかがトクになるか、
関数の比較でわかりますね!

あとは誕生日の関係の問題だとどうですか?
http://ja.wikipedia.org/wiki/%E8%AA%95%E7%94%9F%E6%97%A5%E3%81%AE%E3%83%91%E3%83%A9%E3%83%89%E3%83%83%E3%82%AF%E3%82%B9
誕生日のパラドックスが絶対いいと思うんですが、それがもし難しすぎるなら
n人の集団の中に自分と同じ誕生日の人がいる確率、はどうでしょうか。

確率をp、人数をnとするとき、n人の集団の中に自分と同じ誕生日の人がいる確率は
p=1-(364/365)^n

となります。累乗はNGですかね…。

http://keisan.casio.jp/exec/system/1161228814
でもこのサイトだとオンラインでその計算をしてくれます。
自分で組み立てられなくても、味わって楽しむこともできるのではないでしょうか。

http://ja.wikipedia.org/wiki/%E7%B4%99%E3%81%AE%E5%AF%B8%E6%B3%95
Wikipediaには「紙の寸法」という記事があり、
ここにAnの長辺のサイズを求める式が出ています。
nに4を入れるとA4の長辺のサイズがわかります!
でも床関数とかNGなんですよね…。

http://www.tenki.jp/indexes/cough/
それと、風邪ひき指数というものがあり、
これを気温と湿度から算出できないかなと思ったのですが、
どうも指数のはじき出し方は見つけられませんでした。
気象関係の関数は楽しそうだと思ったのですが、なかなか難しいです。
http://homepage2.nifty.com/luminaries/guidance/kishou_018.htm
不快指数は式が見つかりましたが、季節外れですね…。

http://keisan.casio.jp/
話は戻りますが、こちらのサイトはどれも楽しくて応用が効きそうです。
http://keisan.casio.jp/exec/system/1373508428
このへんは特に身近で良さそう。
私はHTMLとか読めないんですが、内部JavaScriptで動いてたりしたら活用できますね。

まとまりのない回答ですが、いかがでしょうか。

id:lionfan2

sokyo様、まとまりがないどろか、むしろきれいにまとめていただき、ありがとうございます!!
携帯関数とか、同じ誕生日関数は、どちらも良さそうです。
ことに携帯は、学生ウケが良さそうですね。ありがとうございます!!

2014/11/29 23:13:01

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません