返回   ShareGet 社群討論 > ≡ 電腦網路 ≡ > □ -- 程式設計討論

發表新主題 回覆
 
主題工具 顯示模式
  #1  
舊 2005-11-28, 06:50 PM
正式會員
 
註冊日期: 2004-10-18
文章: 63
給予: 0 | 感謝 0 | 共 0 篇
積分: 10 | 給分能力: 18
[問題][C&C++] 樂透機(已解決)

樂透機 


選擇大樂透(6/49)或小樂透(6/42),亂數選出6個不同號碼,並排序選出之6個號碼(由小至大)。


#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char *argv[])
{
int B_S,MaxNum,I,J,TempRand,lotto[6];
srand(time(NULL));
printf("0.exit\n");
printf("1.Big Lotto (6/49)\n");
printf("2.Small Lotto (6/42)\n");
printf("Your Choice : ");
scanf("%d",&B_S);
switch(B_S){
case 1: printf("\nYour Choice is Big Lotto\n"); MaxNum=49; break ;
case 2: printf("\nYour Choice is Small Lotto\n"); MaxNum=42; break ;
default : return 0 ;
}
printf("\nThe UnSort Lotto Numbers are:");
//--------------亂數取6個值 但是不重複--------------
for(I=0;I<6;I++){
do{
TempRand=(rand()%MaxNum)+1;
for(J=0;J<I;J++){
if(TempRand==lotto[J]) break;
}
} while (TempRand==lotto[J]);
lotto[i]=TempRand;
printf(" %d,",lotto[i]);
}
printf("\n");
//--------------排序--------------------
for(J=5;J>0;J--){
for(I=0;I<J;I++){
if(lotto[i]>lotto[I+1]){
TempRand=lotto[i];
lotto[i]=lotto[I+1];
lotto[I+1]=TempRand;
}
}
}
//---------------------------------------
printf("\nThe Sorted Lotto Numbers are:");
for(I=0;I<6;I++){
printf(" %d,",lotto[i]);
}
printf("\n\n");
system("PAUSE");
return 0;
}
這是我們老師寫的
0.exit
1.Big Lotto (6/49)
2.Small Lotto (6/42)

執行結果 大樂透
UnSort Lotto Number are:28.25.49.7.29.36
Sort Lotto Number are:7.25.28.29.36.49
Press any key to continue

執行結果 小樂透
UnSort Lotto Number are:25.42.22.35.34.32
Sort Lotto Number are:22.25.32.34.35.42
Press any key to continue

要怎麼讓這個程式繼續執行呢???因為執行ㄧ次就跳回程式了......

知道的人幫忙ㄧ下,謝謝.....這個程式是請人幫忙寫的,但我忘了跟他說要回圈......
__________________
愛你毆!!!

此文章於 2005-12-20 02:07 AM 被 warjod 編輯.
回覆時引用此文章
  #2  
舊 2005-11-28, 07:22 PM
初級會員
 
註冊日期: 2005-11-12
文章: 10
給予: 0 | 感謝 0 | 共 0 篇
積分: 25 | 給分能力: 13
for(i=0;i<6;i++);{
for 後面的分號不要 就可以了
回覆時引用此文章
  #3  
舊 2005-11-28, 08:36 PM
正式會員
 
註冊日期: 2004-07-15
文章: 61
給予: 0 | 感謝 0 | 共 0 篇
積分: 2034 | 給分能力: 23
for(i=0;i<6;i++);{
刪除 ;

lotto[i]=1+(int)42.0*(rand()/(RAND_MAX+1.0));
printf("%d\n",lotto[i]);
}

此文章於 2005-11-28 08:42 PM 被 cwhung 編輯.
回覆時引用此文章
  #4  
舊 2005-11-29, 06:29 AM
正式會員
 
註冊日期: 2005-06-25
文章: 73
給予: 0 | 感謝 0 | 共 0 篇
積分: 369 | 給分能力: 15
嗯~~我有點好奇為什麼那段產生亂數的程式碼不會產生重複的數字!?

不知道這個程式是用什麼compile的!?我用Turbo C++和Dev-C++都會產生問題說。

Dev-C++裡好像沒有clrscr()和randomize()兩個函式。有人知道是放哪裡嗎!?
__________________
掬一把人間淨土,造千年人間仙境
回覆時引用此文章
  #5  
舊 2005-11-29, 06:51 AM
vxr 的頭像
vxr vxr 目前在線上
星の魂
 
註冊日期: 2005-02-08
文章: 725
給予: 0 | 感謝 6 | 共 4 篇
積分: 4588 | 給分能力: 27
代碼:
#include "stdafx.h"
#include <iostream>
#include <time.h>
using namespace std;
#define vsize 6
int _tmain(int argc, _TCHAR* argv[])
{
	int lotter[vsize]= { 0 } , rvalue,cvaluea;
		srand ((unsigned)time(NULL));
			for ( cvaluea=0 ; cvaluea < 6 ; cvaluea++)
			{
			lotter[cvaluea]=rand()%42+1;
				for(int  cvalueb=0; cvalueb < cvaluea ; cvalueb++)
				{
					if(lotter[cvaluea]==lotter[cvalueb])
					{
					lotter[cvaluea]=0;
					cvaluea=cvaluea-1;
					}
				}
	}
		for (cvaluea-- ;cvaluea>=0 ; cvaluea--)
		{
		cout << lotter[cvaluea] << endl;
		}		
system("pause");
}
這是在下很久以前用C++ .NET寫的..
幫人家寫的..(對方急著交作業=_="" )
-----------------------------------------------------------------
for(int cvalueb=0; cvalueb < cvaluea ; cvalueb++)
{
if(lotter[cvaluea]==lotter[cvalueb])
{
lotter[cvaluea]=0;
cvaluea=cvaluea-1;
}
}
-----------------------------------------------------------------
這一段是我不會讓她數字重複的原因

此文章於 2005-11-29 07:47 AM 被 vxr 編輯.
回覆時引用此文章
  #6  
舊 2005-11-29, 08:37 AM
正式會員
 
註冊日期: 2005-06-25
文章: 73
給予: 0 | 感謝 0 | 共 0 篇
積分: 369 | 給分能力: 15
  嗯~~小弟是寫這個樣子,年代久遠,自己看上去也有些怪怪的。跟vxr的想法應該有些類似的。

  會先產生一個號碼,然後其他號碼再依序比較(先產生第一個號碼好像沒太大的意義...)

代碼:
/* Get first random seed */
lotto[0] = rand() % 42 + 1;
    
/* Generate the rest lucky nums */
for(i=1;i<6;i++)
{
    temp = rand() % 42 + 1;
    for(j=0;j<index;j++)
    {
            if(lotto[j]==temp)
            {
                            temp = rand() % 42 + 1;
            } else {
                            continue;
            }
    }
    lotto[i] = temp;
    index++;
}
__________________
掬一把人間淨土,造千年人間仙境
回覆時引用此文章
  #7  
舊 2005-11-29, 09:26 AM
vxr 的頭像
vxr vxr 目前在線上
星の魂
 
註冊日期: 2005-02-08
文章: 725
給予: 0 | 感謝 6 | 共 4 篇
積分: 4588 | 給分能力: 27
引用:
作者: wongwt
  嗯~~小弟是寫這個樣子,年代久遠,自己看上去也有些怪怪的。跟vxr的想法應該有些類似的。

  會先產生一個號碼,然後其他號碼再依序比較(先產生第一個號碼好像沒太大的意義...)

代碼:
/* Get first random seed */
lotto[0] = rand() % 42 + 1;
    
/* Generate the rest lucky nums */
for(i=1;i<6;i++)
{
    temp = rand() % 42 + 1;
    for(j=0;j<index;j++)
    {
            if(lotto[j]==temp)
            {
                            temp = rand() % 42 + 1;
            } else {
                            continue;
            }
    }
    lotto[i] = temp;
    index++;
}
好像只給一部份???
回覆時引用此文章
  #8  
舊 2005-11-29, 10:40 AM
正式會員
 
註冊日期: 2005-06-25
文章: 73
給予: 0 | 感謝 0 | 共 0 篇
積分: 369 | 給分能力: 15
嗯嗯~~只有核心的code。

這寫得太失敗了,不敢全PO上來~~XD~~

哪天改寫完再弄上來好了~~
__________________
掬一把人間淨土,造千年人間仙境
回覆時引用此文章
  #9  
舊 2005-11-29, 10:23 PM
忠實會員
 
註冊日期: 2005-11-05
文章: 197
給予: 0 | 感謝 0 | 共 0 篇
積分: 2061 | 給分能力: 17
這是我之前在 linux 上寫的
我最主要是著重在分析數字的分布

因為我老婆之前看電視開獎
她說
"為什麼開出來的數字
一定有連號的
台北銀行一定有作弊"

所以就寫了這個程式:
代碼:
#include <stdio.h>

#define MAX_NUMBER 49

char *sumstr[] =
{
  "6    ",
  "5    ",
  "4    ",
  "4-2  ",
  "3    ",
  "3-3  ",
  "3-2  ",
  "2    ",
  "2-2  ",
  "2-2-2",
  "0    "
};

char number[14000000][7];
int sum[20];

int fnCheckRepeat(char *num)
{
  int i, j;

  for (i=0; i<5; i++)
    for (j=i+1; j<6; j++)
      if (*(num+i) == *(num+j))
        return 1;

  return 0;
}

unsigned long fnGenerateNumber()
{
  unsigned long index;
  char n[7];
  int i;

  for (i=0; i<6; i++)
    n[i] = i + 1;
  n[6] = 0;

  strcpy(number[0], n);

  index = 1;
  while ( 1 )
  {
    n[5]++;
    if (n[5] > MAX_NUMBER)
    {
      n[4]++;
      n[5] = n[4];
      if (n[4] > MAX_NUMBER)
      {
        n[3]++;
        n[5] = n[4] = n[3];
        if (n[3] > MAX_NUMBER)
        {
          n[2]++;
          n[5] = n[4] = n[3] = n[2];
          if (n[2] > MAX_NUMBER)
          {
            n[1]++;
            n[5] = n[4] = n[3] = n[2] = n[1];
            if (n[1] > MAX_NUMBER)
            {
              n[0]++;
              n[5] = n[4] = n[3] = n[2] = n[1] = n[0];
              if (n[0] > MAX_NUMBER)
                return index;
            }
          }
        }
      }
    }

    if ( fnCheckRepeat(n) )
      continue;

    strcpy(number[index], n);
    index++;
  }

  return 0;
}

void fnAnalysisNumber(unsigned long total)
{
  int result[32];
  unsigned long i;
  char r;
  int j;

  for (j=0; j<32; j++)
    result[j] = 0;

  for (i=0; i<total; i++)
  {
    r = 0;
    for (j=0; j<5; j++)
      if ((number[i][j+1]-number[i][j]) == 1)
        r |= 1 << (4 - j);

    result[r]++;
  }

  printf("Number analysis:\n");
  j = result[0x1F];
  printf(" 6     ==> %7ld ( %6.3f )\n", j, (double)j/total*100);
  j = result[0x0F] + result[0x1E];
  printf(" 5     ==> %7ld ( %6.3f )\n", j, (double)j/total*100);
  j = result[0x07] + result[0x0E] + result[0x1C];
  printf(" 4     ==> %7ld ( %6.3f )\n", j, (double)j/total*100);
  j = result[0x17] + result[0x1D];
  printf(" 4-2   ==> %7ld ( %6.3f )\n", j, (double)j/total*100);
  j = result[0x03] + result[0x06] + result[0x0C] + result[0x18];
  printf(" 3     ==> %7ld ( %6.3f )\n", j, (double)j/total*100);
  j = result[0x1B];
  printf(" 3-3   ==> %7ld ( %6.3f )\n", j, (double)j/total*100);
  j = result[0x0B] + result[0x0D] + result[0x13] + result[0x16] + result[0x19] + result[0x1A];
  printf(" 3-2   ==> %7ld ( %6.3f )\n", j, (double)j/total*100);
  j = result[0x01] + result[0x02] + result[0x04] + result[0x08] + result[0x10];
  printf(" 2     ==> %7ld ( %6.3f )\n", j, (double)j/total*100);
  j = result[0x05] + result[0x09] + result[0x0A] + result[0x11] + result[0x12] + result[0x14];
  printf(" 2-2   ==> %7ld ( %6.3f )\n", j, (double)j/total*100);
  j = result[0x15];
  printf(" 2-2-2 ==> %7ld ( %6.3f )\n", j, (double)j/total*100);
  j = result[0x00];
  printf(" 0     ==> %7ld ( %6.3f )\n", j, (double)j/total*100);
  printf("\n\n");
}

void fnPrintNumber(unsigned long index)
{
  int i;
  char r;

  r = 0;
  for (i=0; i<5; i++)
    if ((number[index][i+1]-number[index][i]) == 1)
      r |= 1 << (4 - i);

  switch ( r )
  {
    case 0x1F: sum[0]++; break;             // 11111
    case 0x0F:                              // 01111
    case 0x1E: sum[1]++; break;             // 11110
    case 0x07:                              // 00111
    case 0x0E:                              // 01110
    case 0x1C: sum[2]++; break;             // 11100
    case 0x17:                              // 10111
    case 0x1D: sum[3]++; break;             // 11101
    case 0x03:                              // 00011
    case 0x06:                              // 00110
    case 0x0C:                              // 01100
    case 0x18: sum[4]++; break;             // 11000
    case 0x1B: sum[5]++; break;             // 11011
    case 0x0B:                              // 01011
    case 0x0D:                              // 01101
    case 0x13:                              // 10011
    case 0x16:                              // 10110
    case 0x19:                              // 11001
    case 0x1A: sum[6]++; break;             // 11010
    case 0x01:                              // 00001
    case 0x02:                              // 00010
    case 0x04:                              // 00100
    case 0x08:                              // 01000
    case 0x10: sum[7]++; break;             // 10000
    case 0x05:                              // 00101
    case 0x09:                              // 01001
    case 0x0A:                              // 01010
    case 0x11:                              // 10001
    case 0x12:                              // 10010
    case 0x14: sum[8]++; break;             // 10100
    case 0x15: sum[9]++; break;             // 10101
    case 0x00: sum[10]++; break;            // 00000
  }

  printf("%10d ==>", index);
  for (i=0; i<6; i++)
    printf(" %2d", number[index][i]);
  printf("  ==> ");
  switch ( r )
  {
    case 0x1F: printf(" 6"); break;         // 11111
    case 0x0F:                              // 01111
    case 0x1E: printf(" 5"); break;         // 11110
    case 0x07:                              // 00111
    case 0x0E:                              // 01110
    case 0x1C: printf(" 4"); break;         // 11100
    case 0x17:                              // 10111
    case 0x1D: printf(" 4-2"); break;       // 11101
    case 0x03:                              // 00011
    case 0x06:                              // 00110
    case 0x0C:                              // 01100
    case 0x18: printf(" 3"); break;         // 11000
    case 0x1B: printf(" 3-3"); break;       // 11011
    case 0x0B:                              // 01011
    case 0x0D:                              // 01101
    case 0x13:                              // 10011
    case 0x16:                              // 10110
    case 0x19:                              // 11001
    case 0x1A: printf(" 3-2"); break;       // 11010
    case 0x01:                              // 00001
    case 0x02:                              // 00010
    case 0x04:                              // 00100
    case 0x08:                              // 01000
    case 0x10: printf(" 2"); break;         // 10000
    case 0x05:                              // 00101
    case 0x09:                              // 01001
    case 0x0A:                              // 01010
    case 0x11:                              // 10001
    case 0x12:                              // 10010
    case 0x14: printf(" 2-2"); break;       // 10100
    case 0x15: printf(" 2-2-2"); break;     // 10101
    case 0x00: printf(" 0"); break;         // 00000
  }
  printf("\n");
}

int main(int argc, char *argv[])
{
  int result[MAX_NUMBER+1];
  unsigned long total, r;
  int n=0;
  int i, j;

  srand(time(NULL));

  for (i=0; i<=MAX_NUMBER; i++)
    result[i] = 0;

  for (i=0; i<20; i++)
    sum[i] = 0;

  total = fnGenerateNumber();
  printf("total: %ld\n\n", total);

  fnAnalysisNumber(total);

  if (argc >= 2)
    n = atoi(argv[1]);
  if (n < 1) n = 1;

  for(i=0; i<n; i++)
  {
    r = rand() % total;
    fnPrintNumber(r);
    for (j=0; j<6; j++)
      result[number[r][j]]++;
  }

  printf("\nSummary:\n");
  for (i=1; i<=MAX_NUMBER; i++)
  {
    printf(" %3d", result[i]);
    if ((i % 10) == 0)
      printf("\n");
  }
  printf("\n\n");

  for (i=0; i<=10; i++)
    printf(" %s = %d\n", sumstr[i], sum[i]);
  printf("\n");

  exit(0);
}
底下是執行結果:
代碼:
total: 13983816     <== 這是全部的數字

Number analysis:
 6     ==>      44 (  0.000 )   <== 六個數字都連號
 5     ==>    1892 (  0.014 )   <== 五個數字連號
 4     ==>   39732 (  0.284 )   <== 四個數字連號
 4-2   ==>    1892 (  0.014 )   <== 四個數字連號, 外加兩個連號
 3     ==>  543004 (  3.883 )   <== 三個數字連號
 3-3   ==>     946 (  0.007 )   <== 三個-三個連號
 3-2   ==>   79464 (  0.568 )   <== 三個-兩個連號
 2     ==> 5430040 ( 38.831 )   <== 兩個連號
 2-2   ==>  814506 (  5.825 )   <== 兩個-兩個連號
 2-2-2 ==>   13244 (  0.095 )   <== 兩個-兩個-兩個連號
 0     ==> 7059052 ( 50.480 )   <== 完全不連號


   6593339 ==>  5 14 28 32 33 42  ==>  2

Summary:
   0   0   0   0   1   0   0   0   0   0
   0   0   0   1   0   0   0   0   0   0
   0   0   0   0   0   0   0   1   0   0
   0   1   1   0   0   0   0   0   0   0
   0   1   0   0   0   0   0   0   0

 6     = 0
 5     = 0
 4     = 0
 4-2   = 0
 3     = 0
 3-3   = 0
 3-2   = 0
 2     = 1
 2-2   = 0
 2-2-2 = 0
 0     = 0
所以可以知道出現兩個連號的機率蠻大的, 有 38.8 的機率
如果將程式改成 38 個號碼(將 #define MAX_NUMBER 49 中 49 改成 32 即可)
機率會更大(超過 50)
回覆時引用此文章
  #10  
舊 2005-11-29, 10:48 PM
初級會員
 
註冊日期: 2005-11-12
文章: 10
給予: 0 | 感謝 0 | 共 0 篇
積分: 25 | 給分能力: 13
唉... 本來是不想 直接把 程式碼PO上來.
想說樓主既然有修這門課,還是自己先想一下
我只給個提示就好了
後來又覺得 如果基礎不好 或是 觀念不對
想也想不出所以然,乾脆直接把答案寫出來,
是真的想學 還是只是想抄 就隨便了

底下的程式 是在 Dev-C++ 4 執行


代碼:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>

int main(int argc, char *argv[])
{
  int B_S,MaxNum,I,J,TempRand,lotto[6];
  srand(time(NULL));
  printf("0.exit\n");
  printf("1.Big Lotto (6/49)\n");
  printf("2.Small Lotto (6/42)\n");
  printf("Your Choice : ");
  scanf("%d",&B_S);
  switch(B_S){
    case 1:  printf("\nYour Choice is Big Lotto\n"); MaxNum=49; break ;
    case 2:  printf("\nYour Choice is Small Lotto\n"); MaxNum=42; break ;
    default : return 0 ;
  }
  printf("\nThe UnSort Lotto Numbers are:");
//--------------亂數取6個值 但是不重複--------------
  for(I=0;I<6;I++){
    do{
      TempRand=(rand()%MaxNum)+1;
      for(J=0;J<I;J++){
        if(TempRand==lotto[J]) break;
      }
    } while (TempRand==lotto[J]);
    lotto[i]=TempRand;
    printf(" %d,",lotto[i]);
  }
  printf("\n");
//--------------排序--------------------
  for(J=5;J>0;J--){
    for(I=0;I<J;I++){
      if(lotto[i]>lotto[I+1]){
        TempRand=lotto[i];
        lotto[i]=lotto[I+1];
        lotto[I+1]=TempRand;
      }
    }
  }
//---------------------------------------
  printf("\nThe Sorted Lotto Numbers are:");
  for(I=0;I<6;I++){
    printf(" %d,",lotto[i]);
  }
  printf("\n\n");
  system("PAUSE");
  return 0;
}
附上編譯過的執行檔 Lotto.exe

有一點很奇怪 我的原始程式 I 都是大寫的
為什麼 貼上來 會自動變小寫的呢?

此文章於 2005-11-30 08:55 PM 被 heavywang 編輯.
回覆時引用此文章
發表新主題 回覆

書簽

主題工具
顯示模式

發文規則
不可以發表新主題
不可以發表回覆
不可以上傳附件
不可以編輯自己的文章

啟用 BB 代碼
論壇啟用 表情符號
論壇啟用 [IMG] 代碼
論壇禁用 HTML 代碼
Trackbacks are 禁用
Pingbacks are 禁用
Refbacks are 禁用
論壇跳轉


所有時間均為GMT -5。現在的時間是 10:13 PM


Powered by vBulletin® Copyright ©2000 - 2009, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.2.0 ©2008, Crawlability, Inc.