gcc の関数内関数って、Pascal コンパイラ実装するために実装されたという話を大昔に聞いた(読んだ)ような気がする。
その当時は g++も gFORTRANもなかったしねえ>GCC
いや、g++ (と f2c)はあったか?
でも今は停止してるっぽいな >GNU Pascal
GNU Pascal
Pascal はこれとして、Modula-2 はどうなったんだろう(調べない)。
一部で盛り上がったこの話題。
Mac、iOSで、rand()関数の疑似乱数アルゴリズムがヘン! - Qiita
xcode - c言語での乱数生成 - スタック・オーバーフロー
落ち着いて記事を読んでみるとそもそもの疑問(質問)はなんだったかというと
Mac、iOSで、rand()関数の疑似乱数アルゴリズムがヘン! - Qiita
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, const char * argv[]) {
unsigned int i;
unsigned int seed = (unsigned int)time(NULL);
for (i = 0; i < 100; i++) {
srand(seed + i); ///////////////////////
printf("%d, ", rand() % 7);
}
putchar('\n');
return 0;
}
Mac、iOSで、rand()関数の疑似乱数アルゴリズムがヘン! - Qiita
7の剰余を使うと、同じ値の繰り返しになりますが、それ以外の剰余、たとえば3だと、「2, 1, 0, 2, 1, 0……」と循環数になります。
xcode - c言語での乱数生成 - スタック・オーバーフロー
#include<time.h>
#include<stdio.h>
#include<stdlib.h>
int main(void){
int i,num;
srand(time(NULL));
num=rand()%7;
for(i=0;i<10;i++){
printf("%d\n",num);
}
return 0;
}
これでnumは0~6になる思うのですが、すべて4になってしまいます。
num=rand()%7の7を他の数字でやると0〜その数字の間の数となります。
7の時のみこのようになってしまうのですがなぜでしょうか?
環境はMacBook Pro、xcode Version 6.1です。
といったもので、rand(3) がー。とか、下位桁の剰余ー。
とは関係ない部分に回答してる人がほとんどいないという。
とはいえ皆無ではなく
Mac、iOSで、rand()関数の疑似乱数アルゴリズムがヘン! - Qiita
そしてx = 16807 * lo - 2836 * hi;ですから、loには16807が掛けられます。早い話が、この数字16807は7の合成数なのです。
7*7*7*7*7=16807ですね。ですから、seedに経過秒数や1ずつ増える値を渡しても、それと乗算されるloが7だけによる合成数
なので、このような結果になってるのだと思います。
で、この回答(の元記事)にあったリンク先の rand() のコードを見ると
rand.c
static int
do_rand(unsigned long *ctx)
{
#ifdef USE_WEAK_SEEDING
/*
* Historic implementation compatibility.
* The random sequences do not vary much with the seed,
* even with overflowing.
*/
return ((*ctx = *ctx * 1103515245 + 12345) % ((u_long)RAND_MAX + 1));
#else /* !USE_WEAK_SEEDING */
/*
* Compute x = (7^5 * x) mod (2^31 - 1)
* without overflowing 31 bits:
* (2^31 - 1) = 127773 * (7^5) + 2836
* From "Random number generators: good ones are hard to find",
* Park and Miller, Communications of the ACM, vol. 31, no. 10,
* October 1988, p. 1195.
*/
long hi, lo, x;
/* Can't be initialized with 0, so use another value. */
if (*ctx == 0)
*ctx = 123459876;
hi = *ctx / 127773;
lo = *ctx % 127773;
x = 16807 * lo - 2836 * hi;
if (x < 0)
x += 0x7fffffff;
return ((*ctx = x) % ((u_long)RAND_MAX + 1));
#endif /* !USE_WEAK_SEEDING */
}
なるほど。秒数とすると、
127773 / 86400 で、1.5日にちょっと欠けるくらいですか。
といった辺りを踏まえて改めてこれを見てみましょう(にやにや)
はてなブックマーク - Mac、iOSで、rand()関数の疑似乱数アルゴリズムがヘン! - Qiita
The Inevitable Return of COBOL
という記事によると、COBOL プログラマーの年齢構成の比率は
(足すと101になるんだけど多分丸めのせいだろう)
年齢 %
------------------------
25-35 6
35-45 34
45-55 52
55+ 7
NO COBOL Programmer 2
Don't Know 1
これはまあそうなんだろうねえという感じなんですが
70% すべてのビジネストランザクションのうちCOBOLが使われている割合
220 BN COBOLで書かれたコードの総行数
1.5 BN 一年辺りの新規のCOBOLコードの行数
なんてのはええっ!? っという感じが。