1 :
名無しさん@夢いっぱい:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int GetRandom(int min,int max);
int main(void)
{
int i;
srand((unsigned int)time(NULL));
for (i = 0;i < 100;i++) {
printf("%03d\n",GetRandom(0,999));
}
return 0;
}
int GetRandom(int min,int max)
{
return min + (int)(rand()*(max-min+1.0)/(1.0+RAND_MAX));
}
これを実行するとナンバーズ3100回試行
ロト6はむずい・・・
言語の問題なのか?
3 :
名無しさん@夢いっぱい:2006/09/18(月) 02:20:51 ID:7H0s5HK4
明日仕事だから寝る!
stdlib.hのrand()は、つかいもんにならない
5 :
名無しさん@夢いっぱい:2006/09/18(月) 02:27:40 ID:e8VRFwBo
#include <chinpo.h>
6 :
名無しさん@夢いっぱい:2006/09/18(月) 11:36:45 ID:N6sdA750
ここ石豆の気配がするな。
8 :
名無し:2006/09/19(火) 09:40:01 ID:GJuEXCln
このスレはC言語を指定してるので安心だ
ttp://www.math.sci.hiroshima-u.ac.jp/~m-mat/MT/MT2002/mt19937ar.html メルセンヌ・ツイスタ
gzipped tar-file of these files: mt19937ar.sep.tgz .
↑
この圧縮ファイルをダウンロードする。
WindowsパソコンにCygwinをインストールした状態でtar(xzfオプション)により展開した。
$ tar xzf mt19937ar.sep.tgz
$ ls -l mt*
-rw------- 1 UserName なし 5996 Apr 26 2005 mt19937ar.c
-rw------- 1 UserName なし 2928 Apr 26 2005 mt19937ar.h
-rw------- 1 UserName なし 22465 Mar 2 2004 mt19937ar.out
-rwxr-xr-x 1 UserName なし 15433 Sep 19 23:38 mt19937ar.sep.tgz
-rw------- 1 UserName なし 2539 Apr 26 2005 mtTest.c
>>9 スレッドが立てられた日付はこちらの方が後であり、
>>8のスレッドでも問題なく話ができることを考えると
削除ガイドライン
ttp://info.2ch.net/guide/adv.html の要件は満たしていると言える。
ただ現在の宝くじ板は過疎であり、スレッド保持上限値にかなり余裕があり
多少の重複スレや駄スレが立っても、そのせいで有用なスレッドがはじきだされる
心配はなく、少数の潔癖症の方々が気分を悪くするだけで大した問題ではない
と思われる。
>>11を言い直してみる。
このスレッドが扱う話題は
>>8のスレッドの話題の範囲に完全に含まれる。
そして
>>8のスレッドはこのスレッドが建つ前からあり、
建った時点において
>>8のスレッドが他の言語によるプログラムの
話題に占有されていたという事態は見受けられない。つまり新たにスレッドを建てる
までもなく、ここでの話は
>>8のスレッドですることができた。
>>1は建てる必要のないスレッドを建ててしまった。
しかし宝くじ板のスレッド数上限800にはまだ余裕があり、今回は大目に見てもいいだろう。
夢ロトくんは攪拌してからボールの列を形成して6個摘出するが、
以下のプログラムでは攪拌しないで列からメルセンヌ・ツイスタにより6個摘出する。
(予想ではなく6個でたらめに摘出する。)
main()
1.43個のボールをノードとする線形リストを形成する。
2.6個のボールを摘出する。
3.工程1および工程2を反復する。
pLine()
1.何番目のボールを摘出するか、ノードの番号iNを決定する。
2.iN番目のボールの値(文字列)を配列に記憶する。
3.iN番目のボールを破棄して線形リストを短縮する。
4.工程1、工程2、工程3を反復する。
5.配列をソートする。
6.表示を開始する行以降である場合、配列の要素からなる1行を出力する。
【使用法】引き数の個数が4個ではない場合、使用例を表示する。
mtNtoR 43 6 1001 1020
ロト6のボールの総数:43
摘出するボールの個数:6
表示を開始する行番号:1001
反復する回数:1020
この使用例では20行表示される。メルセンヌ・ツイスタの設定を変更するにはmtNtoR.cにおいて
/* メルセンヌ・ツイスタの設定 */
unsigned long init[4] = {0x123, 0x234, 0x345, 0x456}, length = 4;
を変更してコンパイルする。
/* 【ファイル名】mtNtoR.h
bcc32 -emtNtoR mtNtoR.c pNew.c pLine.c iPick.c mt19937ar.c
gcc -o mtntor mtNtoR.c pNew.c pLine.c iPick.c mt19937ar.c
*/
#define USAGE "mtNtoR 43 6 1001 1020\n"
#define EXTRACT 43/* EXTRACT ≦ BALL_COUNT */
#define BALL_COUNT 43
#define DIGITS 3
#define WEIGHT 14.09
#define SKIP 1
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "mt19937ar.h"
typedef struct sBall sBall;
struct sBall {
char *pBall;
double dWeight;
sBall *pNext;
};
int iCompare(const void *p, const void *p2) {
return strcmp((char *)p, (char *)p2);
}
extern sBall *pNew(char *, double);
extern sBall *pAdd(sBall *, sBall *);
extern void FreeAll(sBall *);
extern sBall *pLine(sBall *, int, int, int);
/* 【ファイル名】mtNtoR.c */
#include "mtNtoR.h"
int main(int argc, char *argv[]) {
sBall *pMin;
sBall *p;
char cBall[BALL_COUNT][DIGITS];
int i, iCount, iE, iRepeat, iLine, iShow, iSkip;
char *pStop;
char *pBall;
/* メルセンヌ・ツイスタの設定 */
unsigned long init[4] = {0x123, 0x234, 0x345, 0x456}, length = 4;
/* 入力 */
switch(argc) {
case 5:
iCount = (int)strtol(argv[1], &pStop, 0);/* ボールの総数 */
if(iCount > BALL_COUNT) {
fprintf(stderr, "main(): iCount > BALL_COUNT\n");
exit(EXIT_FAILURE);
}
iE = (int)strtol(argv[2], &pStop, 0);/* 摘出する個数 */
iShow = (int)strtol(argv[3], &pStop, 0);/* 表示を開始する行 */
iRepeat = (int)strtol(argv[4], &pStop, 0);/* 反復する回数 */
break;
default:
fprintf(stderr, USAGE);
exit(EXIT_FAILURE);
}
/* 設定 */
for(i=0; i<iCount; ) {
pBall = &cBall[i][0];
sprintf(pBall, "%02d", ++i);/* cBall[0] = "01", cBall[42] = "43" */
}/* ボールの数値(最小値は1であり最大値はiCountである)を文字列として記憶した */
init_by_array(init, length);/* メルセンヌ・ツイスタの初期化 */
/* 反復(注1) */
iSkip = SKIP;/* 表示しない */
for(iLine = 1; iLine <= iRepeat; iLine++) {
pMin = NULL;/* ボールが無い状態 */
for(i = iCount - 1; i >= 0; i--) {/* 最大値のボールから順に生成、連結する */
pBall = &cBall[i][0];
p = pNew(pBall, WEIGHT);/* ボールを生成した */
pMin = pAdd(pMin, p);/* ボールを連結した */
}
if(iLine >= iShow)
iSkip = 0;/* 表示する */
pMin = pLine(pMin, iCount, iE, iSkip);/* iCount個からiE個を摘出した */
FreeAll(pMin);/* 残りのボールを破棄した */
}
return EXIT_SUCCESS;
}
/* 【ファイル名】pNew.h */
#include <stdio.h>
#include <stdlib.h>
typedef struct sBall sBall;
struct sBall {
char *pBall;
double dWeight;
sBall *pNext;
};
/* mtNtoR.hにおいて #define WEIGHT 14.09
dWeight = WEIGHT
このバージョンではdWeightを活用していない */
/* 【ファイル名】pNew.c */
#include "pNew.h"
sBall *pNew(char *pBall, double dWeight) {
sBall *p;
p = (sBall *)malloc(sizeof(sBall));
if(p == NULL) {
fprintf(stderr, "pNew(): p == NULL\n");
exit(EXIT_FAILURE);
}
p->pBall = pBall;/* 文字列としてボールの値を記憶した */
p->dWeight = dWeight;
p->pNext = NULL;/* pAdd()によってpNextを決定する */
return p;
}
sBall *pAdd(sBall *pMin, sBall *p) {
p->pNext = pMin;/* ボールを連結した */
return p;/* pMin = pAdd()とすることによってpMinを更新する */
}
void FreeAll(sBall *pMin) {
sBall *p;
/* 現在の最小値のボールから順に破棄する */
while(pMin != NULL) {
p = pMin->pNext;
free(pMin);
pMin = p;
}
}
/* 【ファイル名】pLine.h */
#define EXTRACT 43/* EXTRACT ≦ BALL_COUNT */
#define BALL_COUNT 43
#define DIGITS 3
#include <stdio.h>
#include <stdlib.h>
typedef struct sBall sBall;
struct sBall {
char *pBall;
double dWeight;
sBall *pNext;
};
extern int iPick(int);
extern sBall *pShorten(sBall *p, sBall *, sBall *);
extern int iCompare(const void *, const void *);
/* 【ファイル名】pLine.c */
#include "pLine.h"
sBall *pLine(sBall *pMin, int iCount, int iE, int iSkip) {
char c[EXTRACT][DIGITS];
sBall *p;
sBall *pOld;
int i, iN, iPicked;
/* 反復(注2) */
for (iPicked = 0; iPicked < iE; iPicked++) {
iN = iPick(iCount);/* ノードの番号を決定した(1 ≦ iN ≦ iCount) */
p = pMin;/* 現在の最小値のボール */
pOld = NULL;/* 先頭のボールより前方にはボールが存在しない */
for(i = 1; i != iN; i++) {
pOld = p;
p = p->pNext;
};
sprintf(&c[iPicked][0], "%s", p->pBall);/* iN番目のボールの値(文字列)を配列に記憶した */
pMin = pShorten(pMin, pOld, p);/* iN番目のボールを破棄した */
iCount--;/* 摘出したためボールの総数が減少した */
}
if(iSkip == 0) {/* 表示する */
qsort(&c[0][0], iE, DIGITS, iCompare);/* 配列をソートした */
for(i = 0; i < iE; i++) {
printf(" %s", &c[i][0]);/* 配列の要素を出力した */
}
putchar('\n');/* 改行した */
}
return pMin;
}
/* 【ファイル名】iPick.h */
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include "mt19937ar.h"
typedef struct sBall sBall;
struct sBall {
char *pBall;
double dWeight;
sBall *pNext;
};
/* 【ファイル名】iPick.c */
#include "iPick.h"
int iPick(int i) {
int iN;
double d;
if(i <= 0) {
fprintf(stderr, "iPick(): i <= 0\n");
exit(EXIT_FAILURE);
}
d = genrand_real2();/* 区間[0,1)にある値をメルセンヌ・ツイスタにより決定した */
d = d*(double)i;
iN = 1 + (int)floor(d);/* 切上げ */
return iN;/* 1 ≦ iN ≦ i */
}
sBall *pShorten(sBall *pMin, sBall *pOld, sBall *p) {
if(pOld == NULL) {/* 最小値のボールより前方にはボールが存在しない */
pMin = p->pNext;/* 直後のボールを最小値のボールにした */
} else if(p->pNext == NULL) {/* 最大値のボールより後方にはボールが存在しない */
pOld->pNext = NULL;/* 直前のボールを最大値のボールにした */
} else {
pOld->pNext = p->pNext;/* iN番目のボールを迂回した */
}
free(p);/* iN番目のボールを破棄した */
return pMin;
}
【コンパイル】エディタによって全角の空白文字(シフトJISコード8140h)をタブ文字(\tすなわち09h)または半角の空白文字に変換する必要がある。上記のファイルと一緒にmt19937ar.hおよびmt19937ar.cを用意する。
1.Windows 98のMS-DOSプロンプト、Windows 2000のコマンドプロンプトにおいて
ボーランドのコンパイラbcc32をインストールした場合
bcc32 -emtNtoR mtNtoR.c pNew.c pLine.c iPick.c mt19937ar.c
2.WindowsパソコンにCygwinをインストールした場合
gcc -o mtntor mtNtoR.c pNew.c pLine.c iPick.c mt19937ar.c
【実行例】ロト6
B:\BCC>mtntor 43 6 1001 1020
03 12 16 23 24 41
15 18 23 28 37 42
14 17 18 34 37 43
14 15 17 40 41 42
03 04 15 18 21 33
06 24 31 32 34 39
01 13 15 18 28 37
08 10 11 24 29 33
14 25 28 32 36 42
03 05 08 26 32 34
11 14 19 26 30 40
10 12 21 24 38 43
01 03 10 19 32 35
10 17 24 29 30 35
02 17 23 32 39 40
05 10 24 25 33 38
02 07 17 25 28 37
05 07 15 28 30 34
01 12 32 33 39 42
03 17 22 25 26 31
B:\BCC>
【実行例】ミニロト
D:\BCC>mtntor 31 5 1001 1020
05 11 19 23 30
06 15 21 27 30
02 04 24 26 29
03 05 18 22 26
02 08 10 22 25
01 03 12 16 20
05 08 09 13 25
05 09 16 23 26
02 03 10 20 23
02 05 08 10 28
11 14 20 26 27
03 13 14 23 29
01 10 14 24 27
04 10 14 16 22
07 10 26 28 30
02 19 26 28 31
20 23 24 26 27
17 20 21 22 27
02 06 13 15 24
04 09 22 23 27
D:\BCC>
【実行例】ナンバーズ4のシングルのボックス
ただし、0〜9ではなく01〜10を出力するため、たとえば 02 03 05 10は1249と解釈する。
D:\BCC>mtntor 10 4 1001 1020
02 03 05 10
05 07 08 09
01 04 06 08
04 07 08 09
05 07 08 09
01 07 09 10
01 02 04 05
01 02 03 04
02 05 07 08
02 06 08 10
04 06 07 08
01 02 04 07
04 06 07 10
01 02 06 10
01 02 03 05
04 07 09 10
04 05 07 09
01 02 03 08
01 03 05 10
01 06 08 10
D:\BCC>
/*
>>15 (注1)
1.iCount個のボールをノードとする線形リストを形成する
2.iE個のボールを摘出する
3.工程1および工程2を反復する */
/*
>>19 (注2)
1.何番目のボールを摘出するか、ノードの番号iNを決定する
2.iN番目のボールの値(文字列)を配列に記憶する
3.iN番目のボールを破棄して線形リストを短縮する
4.工程1、工程2、工程3を反復する
5.配列をソートする
6.配列の要素からなる1行を出力する */
27 :
名無しさん@夢いっぱい:2006/09/25(月) 00:34:22 ID:z8jHaYTJ
★ロト6 H18/09/21 第309回 01 04 26 36 41 42 (09)
1等小計 800000000 円 = 2 口 × 400000000 円
2等小計 530189000 円 = 22 口 × 24099500 円
3等小計 636204600 円 = 578 口 × 1100700 円
4等小計 561046800 円 = 32619 口 × 17200 円
5等小計 635711000 円 = 635711 口 × 1000 円
全合計 3163151400 円 キャリー 183009018 円
還元額 3346160418 円 還元率 51.0003844 %
販売額 6561049400 円 収益額 3214888982 円
◆ミニロト H18/09/05 第371回 10 12 19 23 31 (27)
1等小計 293107500 円 = 21 口 × 13957500 円
2等小計 21054600 円 = 126 口 × 167100 円
3等小計 36337500 円 = 2907 口 × 12500 円
4等小計 93791500 円 = 85265 口 × 1100 円
全合計 444291100 円 キャリー 0 円
還元額 444291100 円 還元率 44.8144425 %
販売額 991401600 円 収益額 547110500 円
■ナンバーズ4 H18/09/01 第1902回 6275
ストレート 34527500 円 = 25 口 × 1381100 円
ボックス 20182500 円 = 351 口 × 57500 円
Sストレ-ト 48193100 円 = 67 口 × 719300 円
Sボックス 54443900 円 = 1897 口 × 28700 円
全合計 157347000 円 キャリー 0 円
還元額 157347000 円 還元率 44.9538710 %
販売額 350018800 円 収益額 192671800 円
●ナンバーズ3 H18/09/01 第1902回 899
ストレート 9171900 円 = 79 口 × 116100 円
ボックス 9326700 円 = 241 口 × 38700 円
Sストレ-ト 13235400 円 = 171 口 × 77400 円
Sボックス 6407600 円 = 332 口 × 19300 円
ミニ 9372800 円 = 808 口 × 11600 円
全合計 47514400 円 キャリー 0 円
還元額 47514400 円 還元率 44.9579983 %
販売額 105686200 円 収益額 58171800 円
28 :
名無しさん@夢いっぱい:2006/09/25(月) 00:47:39 ID:z8jHaYTJ
29 :
名無しさん@夢いっぱい:2006/09/25(月) 00:52:56 ID:z8jHaYTJ
30 :
名無しさん@夢いっぱい:2006/09/25(月) 01:04:31 ID:z8jHaYTJ
31 :
名無しさん@夢いっぱい:2006/09/27(水) 05:49:58 ID:Nae49S6a
//入力ルーチン
InputData=$.split(" ");
//出力ルーチン
function TableStart(){$+="<table cellspacing=0 cellpadding=3 bgcolor=ffffff bordercolor=black border=1><tbody align=right >";}
function TableText($X,$Y){$+="<tr><td width=50><font size=4><b>"+$X+"</td><td width=250 ><font size=4><b>"+$Y+"</td></tr>";}
function TableEnd(){$+="</table>";} $="";
//表作成ルーチン
TableStart();for ( X=0 ; 1000>=X ; X++ ) { TableText ( X , InputData[ X ].substr( 0 , 20 ) ) ; } TableEnd();
32 :
名無しさん@夢いっぱい:2006/09/27(水) 21:40:56 ID:xtBFJyTf
k
310回結果 03 04 05 18 28 37 (26)
【実行例】ロト6
D:\bcc>mtntor 43 6 125530 125530
03 04 05 18 22 37
D:\bcc>
5個一致('A`)
311回 01 16 22 36 37 42 (34)
D:\bcc>mtntor 43 6 29954 29954
01 04 16 36 37 42
D:\bcc>
35 :
名無しさん@夢いっぱい:2006/10/06(金) 00:48:22 ID:jD0Bghnk
えっ?2等?
36 :
名無しさん@夢いっぱい:2006/10/06(金) 19:04:25 ID:hjMcbuZj
312回結果 02 17 22 29 38 42 (16)
$ mtntor 43 6 14066 14066
17 22 28 29 38 42
('A`)
38 :
名無しさん@夢いっぱい:2006/10/13(金) 01:53:19 ID:E+fDH+dI
結果前にださないの?
20万行(四千万円)までで1等も2等もでていない。3等なら7とおりでた。
第312回 5個一致で3等
17 22 28 29 38 42
01 02 22 29 38 42
02 05 17 29 38 42
01 02 17 22 29 42
02 17 22 38 41 42
02 22 29 38 39 42
02 17 22 29 30 42
>>38 結果前だと
ピンポイントで14066桁目や29954桁目が3等と一致する
なんて解らないだろ。所詮は結果論。
41 :
名無しさん@夢いっぱい:2006/10/13(金) 19:17:36 ID:E+fDH+dI
>>40 確かにわからない…。
だいたいが使い方さえ理解できてないし。
でこれってもう完成したの?
42 :
名無しさん@夢いっぱい:2006/10/13(金) 19:24:20 ID:JPUT5hMD
何故に今更、構造化言語? オブジェクト指向でいこうよ
ではスレを建てるといい。
やだ、94.28%の確立で五等が当たるプログラムが完成していますので晒さないと
スレ立てた意味が無くなるから。
46 :
名無しさん@夢いっぱい:2006/10/18(水) 00:28:31 ID:JkIHbhGs
確率を確立と書く確率94.28%!
♪強そうに 生きてゆ〜くよりも〜
49 :
名無しさん@夢いっぱい:2006/10/30(月) 00:36:07 ID:QSE085ma
loto6 100口、ダブりあり、gawk
BEGIN{
srand()
for(j=0;j<100;j++){
for(i=0;i<43;i++)
a[i]=0
for(i=0;i<6;i++){
do {
x = int(rand()*43)
} while( a[x] == 1 )
a[x]=1
}
for(i=0;i<43;i++)
if( a[i]==1 )
printf "%02d ", i+1
print ""
}
}
予想なんて不可能なんだから、適当に乱数でいいよ
main() {
if( money > 50000 ) {
}
適当な乱数ならQPと同じじゃないか?
>>51 クイックピックが乱数であるとは、どこにもかかれていない
315回 01 02 17 24 40 41 (31)
I:\bcc>mtntor 43 6 2508 2508
01 02 17 24 41 43
I:\bcc>
二十万口(四千万円)で3等が6口でた
01 02 17 24 41 43
01 02 06 17 24 40
01 02 06 24 40 41
01 17 24 33 40 41
01 02 20 24 40 41
01 02 03 17 40 41
#include <stdio.h> /*
>>49 メルセンヌ・ツイスタ版 */
#include <stdlib.h> /* 【ファイル名】loto6.c */
#include <time.h> /* 【コンパイル】bcc32 loto6.c mt19937ar.c */
#include <math.h> /* gcc -o loto6 loto6.c mt19937ar.c */
#include "mt19937ar.h"
int main(void) {
int a[43];
int j, i, x;
/* メルセンヌ・ツイスタの設定 */
unsigned long init[4] = {0x123, 0x234, 0x345, 0x456}, length = 4;
init[0] = (unsigned long)time(NULL);
init_by_array(init, length);/* メルセンヌ・ツイスタの初期化 */
for(j = 0; j < 100; j++){
for(i = 0; i < 43; i++)
a[i] = 0;/* 印が無い */
/* 6個の印をつける */
for(i = 0; i < 6; i++){
do { /* 区間[0,43)にある値をメルセンヌ・ツイスタにより決定する */
x = (int)floor(genrand_real2()*43.);/* xは整数(0 ≦ x ≦ 42) */
} while( a[x] == 1 );/* すでに印があるため、やりなおす */
a[x] = 1;/* 印が無ければ印をつける */
}
for(i = 0; i < 43; i++) /* 出力は昇順になる */
if( a[i] == 1 ) /* a[0]は01、a[1]は02、a[42]は43に対応している */
printf("%02d ", i + 1);
printf("\n");/* 改行した */
}
return EXIT_SUCCESS;
}
【実行例】出力をリダイレクトするには
D:\bcc>loto6 > loto6.txt
D:\bcc>
loto6.txtのファイルをエディタでみる
>>49さん、おもしろいアルゴリズムをおしえてくださってありがとうございます
夢ロトくんは攪拌してからボールの列を形成して6個摘出するが、
以下のプログラム(mtNtoR Version 1.2)では攪拌しないで
列からメルセンヌ・ツイスタにより6個摘出する。
設定ファイルにしたがってボールに重みを付与できる。
重みを均等にすれば旧バージョン
>>14-21と同一の出力になる。
main()
1.設定ファイルからパラメータを取得する(pFile,iCount,iE,iShow,iRepeat,cBall[][],dWeight[])
2.必要に応じてログファイルを追加モードでオープンする(pFile)
3.iCount個のボールをノードとするリストを形成する(数字はcBall[][]、重みはdWeight[])
4.iE個のボールを摘出して、表示開始行以降ならば表示する(iShow)
5.残りのボールを破棄する。
6.工程3、工程4、工程5を反復する(iRepeat)
pLine()
1.iE個のボールを摘出して、配列にボールの数字を記憶する。
2.表示開始行以降ならば配列をソートする。
3.ソートされた配列要素からなる出力文字列を生成する。
4.1行表示する。
5.必要に応じてログファイルに追加する。
pPick()
1.ボールの重みの総和dを計算する。
2.区間[0,d)にある値をメルセンヌ・ツイスタにより決定する(dPick < d)
3.再びボールの重みを加算していきdPickを超えたときボールを決定する(p)
4.pのボールの数字を配列に記憶する。
5.pのボールを破棄してリストを短縮する。
ボールが重いほど出現しやすい。
#【ファイル名】mtNtoR.ini
0x123, 0x234, 0x345, 0x456, 4 # メルセンヌ・ツイスタの設定
Xto6 # 摘出するボールの個数は6
Log mtNtoR.txt # ログファイルを指定できるが必須ではない
From 1001 # 表示を開始する行番号
Repeat 1020 # 反復する回数
01 14.09
02 14.09
03 14.09
04 14.09
05 14.09
06 14.09
07 14.09
08 14.09
09 14.09
10 14.09
11 14.09
12 14.09
13 14.09
14 14.09
15 14.09
16 14.09
17 14.09
18 14.09
19 14.09
20 14.09
21 14.09
22 14.09
23 14.09
24 14.09
25 14.09
26 14.09
27 14.09
28 14.09
29 14.09
30 14.09
31 14.09
32 14.09
33 14.09
34 14.09
35 14.09
36 14.09
37 14.09
38 14.09
39 14.09
40 14.09
41 14.09
42 14.09
43 14.09
/* 【ファイル名】mtNtoR.h
2006-11-13 Version 1.2
【コンパイル】bcc32 -emtNtoR mtNtoR.c pPick.c pLine.c pSetting.c pNew.c pShorten.c mt19937ar.c
gcc -o mtntor mtNtoR.c pPick.c pLine.c pSetting.c pNew.c pShorten.c mt19937ar.c
*/
#define EXTRACT 43/* EXTRACT ≦ BALL_COUNT */
#define BALL_COUNT 43
#define DIGITS 3
#define SKIP 1
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct sBall sBall;
struct sBall {
char *pBall;
double dWeight;
sBall *pNext;
};
int iCompare(const void *p, const void *p2) {
return strcmp((char *)p, (char *)p2);
}
extern FILE *pSetting(int, char *, int *, int *, int *, int *, char *, double *);
extern sBall *pNew(char *, double);
extern sBall *pAdd(sBall *, sBall *);
extern sBall *pLine(sBall *, int, int, int, FILE *);
extern void FreeAll(sBall *);
/* 【ファイル名】mtNtoR.c */
#include "mtNtoR.h"
int main(int argc, char *argv[]) {
double dWeight[BALL_COUNT];
char cBall[BALL_COUNT][DIGITS];
FILE *pFile;
sBall *pMin;
sBall *p;
int i, iCount, iE, iShow, iRepeat, iSkip, iLine;
/* 設定 */
pFile = pSetting(argc, argv[1], &iCount, &iE, &iShow, &iRepeat, &cBall[0][0], &dWeight[0]);
/* 反復(リストを形成、ボールを摘出、ボールを破棄) */
iSkip = SKIP;/* 表示しない */
for(iLine = 1; iLine <= iRepeat; iLine++) {
pMin = NULL;/* ボールが無い状態 */
for(i = iCount - 1; i >= 0; i--) {/* 末尾のボールから順に生成、連結する */
p = pNew(&cBall[i][0], dWeight[i]);/* ボールを生成した */
pMin = pAdd(pMin, p);/* ボールを連結した */
}
if(iLine >= iShow)
iSkip = 0;/* 表示する */
pMin = pLine(pMin, iCount, iE, iSkip, pFile);/* iCount個からiE個を摘出した */
FreeAll(pMin);/* 残りのボールを破棄した */
}
if(pFile != NULL)
fclose(pFile);
return EXIT_SUCCESS;
}
/* 【ファイル名】pPick.h */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include "mt19937ar.h"
typedef struct sBall sBall;
struct sBall {
char *pBall;
double dWeight;
sBall *pNext;
};
extern sBall *pShorten(sBall *, sBall *, sBall *);
#include "pPick.h" /* 【ファイル名】pPick.c */
sBall *pPick(sBall *pMin, int iCount, char *pPicked) {
double d, dPick;
sBall *p;
sBall *pOld;
if(iCount <= 0) {
fprintf(stderr, "pPick(): iCount <= 0\n");
exit(EXIT_FAILURE);
}
d = 0.;
p = pMin;/* 現在の先頭のボール */
do {/* dWeightを加算していき、dWeightの総和を計算する */
d = d + p->dWeight;
p = p->pNext;
} while(p != NULL);
dPick = d * genrand_real2();/* 区間[0,d)にある値をメルセンヌ・ツイスタにより決定した */
d = 0.;
p = pMin;/* 現在の先頭のボール */
pOld = NULL;/* 先頭のボールより前方にはボールが存在しない */
for(;;) {/* 再度、dWeightを加算していく */
d = d + p->dWeight;
if(d > dPick)
break;/* メルセンヌ・ツイスタによる値を超えたためボールを決定した(pを摘出) */
pOld = p;
p = p->pNext;
}
strcpy(pPicked, p->pBall);/* pのボールの値(文字列)を配列に記憶した */
return pShorten(pMin, pOld, p);/* pのボールを破棄した */
}
/* 【ファイル名】pLine.h */
#define OUTPUT 130
#define EXTRACT 43/* EXTRACT ≦ BALL_COUNT */
#define BALL_COUNT 43
#define DIGITS 3
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct sBall sBall;
struct sBall {
char *pBall;
double dWeight;
sBall *pNext;
};
extern sBall *pPick(sBall *, int, char *);
extern int iCompare(const void *, const void *);
/* 【ファイル名】pLine.c */
#include "pLine.h"
sBall *pLine(sBall *pMin, int iCount, int iE, int iSkip, FILE *pFile) {
char *pC;
char cOut[OUTPUT];
char c[EXTRACT][DIGITS];
int i;
/* 反復(注2) */
for (i = 0; i < iE; i++) {
pMin = pPick(pMin, iCount, &c[i][0]);
iCount--;/* 摘出したためボールの総数が減少した */
}
if(iSkip == 0) {
/* 表示する */
qsort(&c[0][0], iE, DIGITS, iCompare);/* 配列をソートした */
cOut[0]='\0';/* 出力文字列の長さを零にした */
pC=&cOut[0];
for(i = 0; i < iE; i++) {
strcat(pC, " ");
strcat(pC, &c[i][0]);/* 出力文字列に配列要素の文字列を追加した */
}
strcat(pC, "\n");/* 出力文字列に改行文字を追加した */
fputs(pC, stdout);/* 1行表示した */
if(pFile != NULL)
fputs(pC, pFile);/* ログファイルに1行追加した */
}
return pMin;
}
/* 【ファイル名】pSetting.h */
#define USAGE "mtNtoR mtNtoR.ini\n"
#define LOG "Log"
#define REPEAT "Repeat"
#define FROM "From"
#define XTO "Xto" /* Xto6 */
#define SETTING 80
#define FILE_NAME 80
#define LINES 70
#define BALL_COUNT 43
#define DIGITS 3
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include "mt19937ar.h"
#include "pSetting.h" /* 【ファイル名】pSetting.c */
FILE *pSetting(int iArg, char *pArg, int *pCount, int *pE, int *pShow, int *pRepeat, char *pBall, double *pWeight) {
char cFile[FILE_NAME], c[SETTING];
char *pC;
char *pStop;
FILE *pFile;
int i, iLine, iS;
unsigned long length, init[4];
switch(iArg) {
case 2:
pFile = fopen(pArg, "rt");/* 設定ファイルをオープンした */
if(pFile == NULL) {
fprintf(stderr, "pSetting(): pFile == NULL (%s)\n", pArg);
exit(EXIT_FAILURE);
}
break;
default:
fprintf(stderr, USAGE);
exit(EXIT_FAILURE);
}
cFile[0]='\0';
*pE = 0;
*pShow = 1;
*pRepeat = 0;
i = 0;
for(iLine = 0; iLine < LINES; iLine++) {
pC = fgets(c, SETTING, pFile);
if(pC == NULL)
break;
pC = strchr(c, '\n');
if(pC == NULL) {
fprintf(stderr, "pSetting(): pC == NULL\n");/* 改行文字が無かった */
exit(EXIT_FAILURE);
}
*pC = '\0';/* 改行文字を削除した */
pC = strchr(c, '#');
if(pC != NULL)
*pC = '\0';/* コメントを削除した */
/* メルセンヌ・ツイスタの設定 */
pC = strstr(c, "0x");
if(pC != NULL) {
iS = sscanf(c, "%lx, %lx, %lx, %lx, %ld", &init[0], &init[1], &init[2], &init[3], &length);
if(iS != 5) {
fprintf(stderr, "pSetting(): iS != 5\n");
exit(EXIT_FAILURE);
}
init_by_array(init, length);/* メルセンヌ・ツイスタの初期化 */
continue;
}
pC = strstr(c, XTO);/* つづく */
if(pC != NULL) {/*
>>66のつづき */
pC = pC + strlen(XTO);
*pE = (int)strtol(pC, &pStop, 0);/* 摘出する個数 */
continue;
}
pC = strstr(c, LOG);
if(pC != NULL) {
pC = pC + strlen(LOG);
sscanf(pC, " %s", &cFile[0]);
continue;
}
pC = strstr(c, FROM);
if(pC != NULL) {
pC = pC + strlen(FROM);
*pShow = (int)strtol(pC, &pStop, 0);/* 表示を開始する行 */
continue;
}
pC = strstr(c, REPEAT);
if(pC != NULL) {
pC = pC + strlen(REPEAT);
*pRepeat = (int)strtol(pC, &pStop, 0);/* 反復する回数 */
continue;
}
if(i >= BALL_COUNT)
continue;
/* ボールの数字(文字列)を配列に記憶する */
pC = &c[0];
iS = sscanf(pC, "%s %lf", pBall, pWeight);
if(iS == 2) {
i++;
pWeight++;
pBall = pBall + DIGITS;
continue;
} else if(iS == EOF) {
continue;
} else {
fprintf(stderr, "pSetting(): iS != 2(%s)\n", pC);
exit(EXIT_FAILURE);
}
}
*pCount = i;
fclose(pFile);/* 設定ファイルをクローズした */
if(cFile[0]=='\0') {
pFile = NULL;/* ログファイルをオープンしない */
} else {
pFile = fopen(cFile, "at");/* ログファイルをオープンした */
if(pFile == NULL) {
fprintf(stderr, "pSetting(): pFile == NULL(%s)\n", &cFile[0]);
exit(EXIT_FAILURE);
}
}
if(*pRepeat == 0) {
fprintf(stderr, "pSetting(): *pRepeat == 0\n");
exit(EXIT_FAILURE);
}
return pFile;
}
/* 【ファイル名】pNew.h */
#include <stdio.h>
#include <stdlib.h>
typedef struct sBall sBall;
struct sBall {
char *pBall;
double dWeight;
sBall *pNext;
};
#include "pNew.h" /* 【ファイル名】pNew.c */
sBall *pNew(char *pBall, double dWeight) {
sBall *p;
p = (sBall *)malloc(sizeof(sBall));
if(p == NULL) {
fprintf(stderr, "pNew(): p == NULL\n");
exit(EXIT_FAILURE);
}
p->pBall = pBall;/* ボールの数字を示す文字列のアドレスを記憶した */
p->dWeight = dWeight;
p->pNext = NULL;/* pAdd()によってpNextを決定する */
return p;
}
sBall *pAdd(sBall *pMin, sBall *p) {
p->pNext = pMin;/* ボールを連結した */
return p;/* pMin = pAdd()とすることによってpMinを更新する */
}
void FreeAll(sBall *pMin) {
sBall *p;
/* 現在の先頭のボールから順に破棄する */
while(pMin != NULL) {
p = pMin->pNext;
free(pMin);
pMin = p;
}
}
/* 【ファイル名】pShorten.h */
#include <stdlib.h>
typedef struct sBall sBall;
struct sBall {
char *pBall;
double dWeight;
sBall *pNext;
};
/* 【ファイル名】pShorten.c */
#include "pShorten.h"
sBall *pShorten(sBall *pMin, sBall *pOld, sBall *p) {
if(pOld == NULL) {/* 先頭のボールより前方にはボールが存在しない */
pMin = p->pNext;/* 直後のボールを先頭のボールにした */
} else if(p->pNext == NULL) {/* 末尾のボールより後方にはボールが存在しない */
pOld->pNext = NULL;/* 直前のボールを末尾のボールにした */
} else {
pOld->pNext = p->pNext;/* 摘出したボールを迂回した */
}
free(p);/* 摘出したボールを破棄した */
return pMin;
}
#【ファイル名】parabola.txt
# y = -20/225 (x - 5)(x - 35)
0x123, 0x234, 0x345, 0x456, 4
Xto6
Log mtNtoR.txt
From 1
Repeat 200000
05 0.000000
06 2.577778
07 4.977778
08 7.200000
09 9.244444
10 11.111111
11 12.800000
12 14.311111
13 15.644444
14 16.800000
15 17.777778
16 18.577778
17 19.200000
18 19.644444
19 19.911111
20 20.000000
21 19.911111
22 19.644444
23 19.200000
24 18.577778
25 17.777778
26 16.800000
27 15.644444
28 14.311111
29 12.800000
30 11.111111
31 9.244444
32 7.200000
33 4.977778
34 2.577778
35 0.000000
>>73の設定ファイルで実験した。大幅に重みが相違しており、削除数字もある。
二十万行の結果として、出現数は以下のとおりであった。
06: 8572 21: 58441
07: 16174 22: 57340
08: 23038 23: 55904
09: 29142 24: 54593
10: 34759 25: 52570
11: 39590 26: 50402
12: 43686 27: 46903
13: 46965 28: 43373
14: 50168 29: 39278
15: 52646 30: 34625
16: 54500 31: 29301
17: 56045 32: 23012
18: 57638 33: 16206
19: 57880 34: 8521
20: 58728
【実行例】設定ファイルを指定する
D:\bcc>mtntor parabola.txt > pa200000.txt
D:\bcc>
pa200000.txtは二十万行ある。ログファイル(mtNtoR.txt)は二十万行以上ある。
77 :
64:2006/11/13(月) 11:59:54 ID:fma5AE7U
>>64 「反復(注2)」については、
>>57のpLine()およびpPick()を参照してください
>>58の設定ファイルで
From 67356 # 表示を開始する行番号
Repeat 67356 # 反復する回数
に変更すれば
D:\bcc>mtntor mtntor.ini
07 15 30 35 36 40
D:\bcc>
2等だ!
>>58の設定ファイル(mtNtoR.ini)において
From 40 # 表示を開始する行番号
Repeat 40 # 反復する回数
に変更すれば
D:\bcc>mtntor mtntor.ini
01 05 25 27 39 41
D:\bcc>
3等
80 :
75:2006/12/09(土) 00:48:31 ID:VPGk+gDZ
332回 07 08 16 24 26 34 (19)
>>58 の設定ファイルを変更して
From 39426 # 表示を開始する行番号
Repeat 39426 # 反復する回数
にすると
D:\bcc>mtntor mtntor.ini
07 08 19 24 26 34
2等だ!
83 :
名無しさん@夢いっぱい:2007/04/01(日) 12:51:52 ID:9RST2uO+
誰か、
>>58 の設定ファイルを変更して
337回 の番号出してけれ!!
85 :
名無しさん@夢いっぱい:2007/04/02(月) 13:09:27 ID:Kpir5bbx
実際当たったヤツおる
86 :
名無しさん@夢いっぱい:2007/04/02(月) 13:40:18 ID:0nXigcqQ
どうせ当たらないソフトだろ?自信がないから晒せないんだろw
完璧にはずれるソフトがあれば、
それはそれで十分すぎるほど
使えるんだがなぁ…。
88 :
名無しさん@夢いっぱい:2007/04/03(火) 17:19:28 ID:8iWcfoHe
私には難しすぎるぉ。もっと簡単にわかりやすくしてよ〜
C++で分析用に作って徐々に分析方法を増やしているんだけど
よく考えたら大した処理が無いからVBでよかったような気がする・・・/(^o^)\
90 :
名無しさん@夢いっぱい:2007/04/09(月) 08:58:12 ID:J4G0JoxL
ロト6の予想数字誰か晒して下さいよ〜
01,02,03,04,05,06,07,08,09,10
11,12,13,14,15,16,17,18,19,20
21,22,23,24,25,26,27,28,29,30
31,32,33,34,35,36,37,38,39,40
41,42,43
92 :
名無しさん@夢いっぱい:2007/04/19(木) 17:40:42 ID:nw7MGTli
Excelの乱数でいいよ
りんごの皮を剥くのに日本刀を振るうみたいな話。
341回 04 14 23 25 28 35 (41)
>>58 の設定ファイルを変更して
From 108359 # 表示を開始する行番号
Repeat 108359 # 反復する回数
にすると
D:\bcc>mtntor mtntor.ini
04 14 23 28 35 41
2等だ!
>>78(11月16日)
>>81(3月1日) 以来、三回目
95 :
名無しさん@夢いっぱい:2007/06/02(土) 12:31:09 ID:XDImr8C2
96 :
名無しさん@夢いっぱい:2007/06/02(土) 16:18:16 ID:6vFyLfMC
ロト6なんか当たるわけないだろバカ
いつまで夢見てんだカス
2007年6月7日 第346回結果 04 09 11 12 32 38 (16)
>>58の設定ファイルで
From 21588 # 表示を開始する行番号
Repeat 21588 # 反復する回数
に変更すると
D:\bcc>mtntor mtntor.ini
04 09 11 16 32 38
D:\bcc>
2等だ! 四回目
#include <GrWin.h>
#include <stdlib.h>
#include <time.h>
#define MAX 100
int xrand(int, int); /* 特定範囲の乱数発生関数 */
int main(void)
{
int width = 640, height = 400;
int n;
float x1, x2, y1, y2;
GWopen(0);
GWsize(-5, &width, &height);
GWsize(-3, NULL, NULL);
GWvport(0.0, 0.0, (float)width / (float)height, 1.0);
GWindow(0.0, 0.0, (float)width - 1.0, (float)height - 1.0);
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
GWclear(-1);
srand(time(NULL));
for(n = 0; n < MAX; ++n){
x1 = (float)xrand(0, width - 1);
x2 = (float)xrand(0, width - 1);
y1 = (float)xrand(0, height - 1);
y2 = (float)xrand(0, height - 1);
GWline(x1, y1, x2, y2);
}
/* -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= */
GWquit();
return 0;
}
int xrand(int lower, int upper)
{
return (upper - lower + 1) * (float)rand() / 32768.0 + lower;
}
第362回結果 07 10 15 20 37 40 (28)
>>58の設定ファイルで
From 66973 # 表示を開始する行番号
Repeat 66973 # 反復する回数
に変更すると
D:\bcc>mtntor mtntor.ini
07 10 15 20 28 40
D:\bcc>
2等だ!
100 :
名無しさん@夢いっぱい:2007/09/28(金) 04:54:37 ID:eJRHDz8A
確率微分方程式でなんとかならないか?