2009-12-17 2 views
0

Спасибо, что помогли мне раньше. Но у меня все еще есть некоторые вопросы о программе. Как сгенерировать новое случайное число, в то время как новое случайное число равно предыдущему случайному числу? Также как перенести матрицу?Как сгенерировать новое случайное число и перенести матрицу?

#include "stdafx.h" 
#include "stdlib.h" 
#include "time.h" 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int num2 = 0; 
    int num=0, i, j;  
    int mtx[9][9] = {0}; 

    while (num < 3 || num > 9) { 
     printf("Enter an integer (3-9): "); 
     scanf("%d", &num); 
    } 
do 
{ 
    srand(time(NULL)); 

    switch (num) 
    { 
    case 3: num2 = rand() % 8; 
     break; 
    case 4: num2 = rand() % 15; 
     break; 
    case 5: num2 = rand() % 24; 
     break; 
    case 6: num2 = rand() % 35; 
     break; 
    case 7: num2 = rand() % 48; 
     break; 
    case 8: num2 = rand() % 63; 
     break; 
    case 9: num2 = rand() % 80; 
     break; 
    } 


    for (i=0; i < num; ++i) 
     for (j=0; j < num; ++j) 
      mtx[i][j] = num2; 
} 
while (num2 == num2); 



    for (i=0; i < num; ++i) { 
    for (j=0; j < num; ++j) 
     printf("%i ", mtx[i][j]); 
    printf("\n"); 
} 



    return 0; 
} 

Update:

#include "stdafx.h" 
#include "stdlib.h" 
#include "time.h" 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    int prevNum2 = 0; 
    int num2 = 0; 
    int num = 0, i, j;  // Added initializers and loop counters 
    int mtx[9][9] = {0}; // Reserve enough space for the worst-case scenario 

    while (num < 3 || num > 9) { // Added input validation loop 
     printf("Enter an integer (3-9): "); 
     scanf("%d", &num); 
    } 

    srand(time(NULL)); 

    do{ 

    prevNum2 =num2; 
    switch (num) 
    { 
    case 3: num2 = rand() % 8; 
     break; 
    case 4: num2 = rand() % 15; 
     break; 
    case 5: num2 = rand() % 24; 
     break; 
    case 6: num2 = rand() % 35; 
     break; 
    case 7: num2 = rand() % 48; 
     break; 
    case 8: num2 = rand() % 63; 
     break; 
    case 9: num2 = rand() % 80; 
     break; 

    } 




    // Loop through the matrix elements we want, filling each with a random number  
    for (i=0; i < num; ++i) 
     for (j=0; j < num; ++j) 
      mtx[i][j] = num2; 
    } 
    while (num2 == prevNum2); 

    /* Do something with the matrix here (display it, etc) */ 

    for (i=0; i < num; ++i) { 
    for (j=0; j < num; ++j) 
     printf("%i ", mtx[i][j]); 
    printf("\n"); 
} 



    return 0; 
} 
+2

Возьмите srand() из петли. И прочитайте некоторые из многих, много вопросов здесь о генерации случайных чисел. – 2009-12-17 14:25:36

+0

Это невероятно неэффективный способ делать то, что вы делаете. Вы хотите присвоить все цифры от '0' до' n-1' ('n = num * num') до' mtx'. Генерирование случайных чисел в диапазоне от «0» до «n-1», а затем проверка того, что он еще не сгенерирован, становится очень медленным, поскольку ваш пул доступных номеров становится меньше. Например, когда вы создали 80 таких чисел, вы знаете, что должно быть 81-м номером, но выполнение этого алгоритма, скорее всего, займет много времени, прежде чем вы найдете нужный вам номер. То, что вы ищете, - это способ перетасовки чисел между '0' и' num * num-1'. –

ответ

1

Я думаю, вы должны изменить эту строку:

while (num2 == num2); 

Как это будет продолжаться до бесконечности при любом значении num2

EDIT:

сделать мой комментарий cleaerer здесь программные биты, чтобы сделать его работу:

do 
{ 
    srand(time(NULL)); 

    switch (num) 

становится:

do 
{ 
    int prevNum2 =num2; 
    switch(num) 

и

while (num2 == num2); 

становится:

while(num2 == prevNum2); 

FINAL EDIT:

в ответ на ваши изменения. Этот фрагмент кода явно не соответствует тем, что вы хотели бы назвать:

for (i=0; i < num; ++i) 
    for (j=0; j < num; ++j) 
     mtx[i][j] = num2; 
} 

Что он делает, это заполнить всю матрицу тем же номером.

то, что вы действительно хотите (возможно), состоит в том, что каждая следующая ячейка заполняется другим числом. Для этого вам понадобится конструкция цикла.

Что-то вдоль линий:

for(int i; i<num*num; i++) 
{ 
     //draw random number bit (shortened for clearity... should be your whole switch bit) 
     num2 = rand() % 8; 

     mtx[i%num][i/num] = num2; 
} 

Вот это ... Таким образом, вся матрица заполняется случайными значениями. Нет необходимости проверять, было ли значение уже сделано до ...поскольку это не проблема

+0

Я думаю, что это тоже неверно, но как я могу его исправить? Я хочу сказать, что «while (new ranNum == previos ranNum)», « –

+0

сделать это точно так же, как вы только что набрали. До типа переключателя: int prevNum2 = num2; ... и while становится: while (num2 == prevNum2) – Toad

+0

как побочный элемент: наличие такого условия превосходит цель rand(). Вполне возможно, что 2 случайных числа будут одинаковыми друг за другом (особенно с использованием такого небольшого числового диапазона). С вашим состоянием вы эффективно наносите ущерб случайному распределению. – Toad

1

Как Нил сказал, srand() должна вызываться один раз в начале программы. Каждый раз, когда вы вызываете srand, вы засеваете генератор случайных чисел, но с этой программой он всегда будет засеян в одно и то же время, поэтому вы получите одинаковое случайное число.

< шутка >

Конечно, это совершенно случайным достаточно некоторыми определениями:

XKCD

</шутка >

+0

Ох ... еще не работает после srand() из цикла. –

+0

Что вы имеете в виду, если не работаете? – Skilldrick

+0

После ввода номера, все еще ничего не распечатывается. –

0

сделать { .. } (х == х)

представляет собой бесконечную петлю. У вас нет инструкций для выхода, чтобы выйти из этого.

2

раздел кода, который читает

switch (num) 
    { 
    case 3: num2 = rand() % 8; break; 
    case 4: num2 = rand() % 15; break; 
    case 5: num2 = rand() % 24; break; 
    case 6: num2 = rand() % 35; break; 
    case 7: num2 = rand() % 48; break; 
    case 8: num2 = rand() % 63; break; 
    case 9: num2 = rand() % 80; break; 
    } 

можно переписать в виде

num2 = rand() % ((num * num) - 1); 

, который является более компактным и, возможно, яснее.

0

Я думаю, что вы пытаетесь инициализировать элементы в mtx с уникальными случайными числами от 0 до n-1, где n является количеством элементов в mtx (это mtx представляет судок клетку?). Если это так:

Ваш цикл for устанавливает все элементы mtx на то же значение. Итак, если вы пытаетесь сделать то, что я думаю, это ни в коем случае не будет работать.

Что вы хотите сделать, это перетасовать список чисел от 0 до n-1. Fisher-Yates shuffle довольно прост и эффективен.

Если вы не хотите иметь дело с malloc и друзьями, вот один из способов сделать это.

/* maximum possible size, replace ... with actual numbers */ 
int list[] = {0,1,2,3,4,5,6,7,8,...,80}; 

/* function to shuffle the first n elements of list */ 
void shuffle(int *list, size_t n); 

, а затем, когда вы знаете значение num.

shuffle(list, num*num); 
for (i=0; i < num; ++i) 
    for (j=0; j < num; ++j) 
     mtx[i][j] = list[i*num+j]; 

и вы можете избавиться от всего кода дело со случайными числами, ваш do...while петли и т.д.

Я не написал shuffle() для вас, потому что я думаю, что это будет весело упражнение для вас делать. :-)

Наконец, ваш запрос:

printf("Enter an integer (3-9): "); 

может не отображаться пользователю в то время вы называете printf() выше, поскольку stdout является линия буферизации по умолчанию во многих системах. Чтобы убедиться, что он отображается до того, как ваша программа ждет ввода, выполните:

fflush(stdout); 

прежде чем вы попытаетесь прочитать ввод. Это обеспечит правильное отображение подсказки.

0

Я считаю, что самый простой способ исправить это без радикальных изменений - это исключить цикл do-while. Если вы хотите сгенерировать матрицу (или сделать что-либо для каждого элемента матрицы - отображение, изменение и т. Д.), Самый простой подход - работать внутри двойного вложенного цикла for. Ваша переменная 'prevnum2' на самом деле не нужна.

for (i = 0; i < num; i++) { 
    for (j = 0; j < num; j++) { 
    switch (num) { // generate a random number 
     ... 
    } 

    mtx[i][j] = num2; // store the random number in the matrix 
    } 
} 

При перемещении вперед и вверх в вашей жизни программирования, вы определенно хотите, чтобы посмотреть в отличные предложения ALOK для лучших методов генерации случайных чисел.

Смежные вопросы