簡體   English   中英

C編程 - 一個數組和一個隨機數組合問題?

[英]C programming - A array and a random number combined question?

這是我的代碼的一部分,我遇到了麻煩。 我無法理解為什么它做錯了。 我有一個數組,它存儲數字0 - 25,這是案件。 這些數字將被隨機化並覆蓋到數組中。 唯一的條件是沒有數字可以是doulbes,只能有一個這個數字。 我不是要求你做我的代碼,而是暗示我或指出我的寫作方向。 我在嘗試學習 :)

問題在於第二個do循環。 我可以把數字隨機化,但我得到雙打。 我創建了一個循環來檢查和修復它,但它不起作用。 代碼確實運行,雙打仍然發生,我不明白為什么。 它對我來說是正確的。 請看,謝謝(:

這就是我最初所做的事情(最后是我現在所處的位置):

int check_double = 0;
int i = 0;
int counter = 0;
int array_adder = 0;
int random_number = 0;

int cases[] = {
    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
    };

float money[] = {
    0.01,1,5,10,25,50,75,100,200,300,400,500,750,1000,5000,10000,25000,50000,750000,100000,200000,300000,400000,500000,750000,1000000
    };

//Randomize all case number and realine them in the array
srand ( time(NULL) );
do
{
    cases[counter]= rand() % 26;
    counter += 1;
    printf("%d\n", cases[counter]);
}
while (counter <= 25);

//make sure there are no doubles in the array, just 0 - 25 and not a single number repeated twice
do
{
    check_double = 0;

    for (i = 0; i < counter; i++)
    {
        if (cases[counter] == cases[i])
        {
            cases[counter] = rand()% 26;
            check_double == 1;
        }
    }
}

while (check_double != 0);

目前,我之后所做的就是梳理兩個循環並檢查數組的雙精度。 這就是我所做的,它仍然有雙打,我不知道為什么,我只發布了兩個循環組合的cose:

do
{

cases[counter]= rand() % 26;

if (cases[counter]>=1);

    for(i=0;i<=counter;i++)

    if (cases[counter]==cases[i])
        {
            cases[counter]=rand()% 26;
        }

printf("%d\n",cases[counter]);
counter+=1;
}

Robsta,您可以嘗試以下代碼,我在Dev-C ++中運行它,您需要的任何更改都可以在您身邊進行。 但是,我向您保證,此代碼會生成您想要的內容。

int check_double = 0;
int i = 0;
int counter = 0;

int cases[] = {
    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
    };
//Randomize all case number and realine them in the array
srand ( time(NULL) );
do
{

cases[counter]= rand() % 26;

   for(i=0;i<counter;i++)
    if (cases[counter]==cases[i]){
      while (cases[counter]==cases[i])
        {
            cases[counter]=rand()% 26;
        }
      i=0;
    }

printf("%d\t%d\n",counter,cases[counter]);
counter+=1;
}while (counter <= 25);

如果您需要任何澄清,我很樂意與您討論。

-Sandip

你只是寫過數組中的最后一個值:

for(i=0;i<counter;i++)
    if (cases[counter]==cases[i])

您需要按原樣循環,然后有一個內部循環,您可以將所有其他條目與當前條目進行比較。

更容易的是做你設置每個隨機數的循環,所以當你設置案例[3]時,循環從0到2並檢查你的3個沖突的新值,如果是,沖洗 - 沖洗 - 重復!

你有這行代碼:

check_double==1;

這不會改變check_double因為它是== ,而不是= ==比較; 它不分配。 將該行更改為:

check_double=1;

一個有用的編譯器(在這個例子中的clang )會給你一個警告:

test.c:5:14: warning: expression result unused [-Wunused-value]
        check_double==1;
        ~~~~~~~~~~~~^ ~

您無法通過單個循環檢查重復項。 您需要至少比較每個可能的元素對,以便能夠查看是否存在重復。 我猜你忘了遍歷counter某處第二內側do...while

請注意,您的方法無法保證終止。 (非常,很可能但不確定。)為什么不簡單地將cases數組洗牌? 洗牌很簡單但很棘手; 請參閱Fisher-Yates(或Knuth)Shuffle獲取簡單算法。

如果你問如何隨機排序數字1-25那么你可以做這樣的事情。 這是生成序列的一種非常強力的方式,但它確實有效,並且可能為您提供更優化的起點。

#include "stdafx.h"
#include <stdlib.h>
#include <time.h>
#include <conio.h>

const int LastNumber = 25;

bool HasEmpty(int available[LastNumber][2])
{
    bool result = false;
    for(int i = 0; i < LastNumber; i++)
    {
        if (available[i][1] == 0)
        {
            result = true;
            break;
        }
    }

    return result;
}

int _tmain(int argc, _TCHAR* argv[])
{
    int available[LastNumber][2];
    int newSequence[LastNumber];

    srand((unsigned int)time(NULL));

    for(int i = 0; i < LastNumber; i++)
    {
        available[i][0]=i;
        available[i][1]=0;
    }

    int usedIndex = 0;

    while (HasEmpty(available))
    {
         int temp = rand() % (LastNumber + 1);
         if (available[temp][1] == 0)
         {
             newSequence[usedIndex++] = available[temp][0];
             available[temp][1] = 1;
         }
    }   

    for(int i = 0; i < LastNumber; i++)
    {
        printf("%d\n",newSequence[i]);
    }

    getch();

    return 0;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM