Как сгенерировать новое случайное число и транспонировать матрицу? - PullRequest
0 голосов
/ 17 декабря 2009

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

#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; 
} 

Обновление:

#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;
}

Ответы [ 6 ]

2 голосов
/ 17 декабря 2009

Секция кода, которая гласит

 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);

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

1 голос
/ 17 декабря 2009

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

 while ( num2 == num2); 

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

EDIT:

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

do 
{ 
    srand(time(NULL));  

    switch (num) 

становится:

do
{
    int prevNum2 =num2;
    switch(num)

и

while ( num2 == num2);

становится:

while( num2 == prevNum2);

ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ:

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

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;
 }

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

1 голос
/ 17 декабря 2009

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

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

XKCD

0 голосов
/ 17 декабря 2009

Я полагаю, что самый простой способ исправить это без радикальных изменений - это устранить цикл «сделай пока». Если вы хотите сгенерировать матрицу (или сделать что-нибудь для каждого элемента матрицы - отобразить, изменить и т. Д.), Самый простой подход - это работать внутри двойного вложенного цикла 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
  }
}

Когда вы продвигаетесь вперед и вверх в своей жизни в программировании, вам наверняка захочется взглянуть на прекрасные предложения Алока по улучшению техники генерации случайных чисел.

0 голосов
/ 17 декабря 2009

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

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

Вам нужно перетасовать список чисел от 0 до n-1. Перестановка Фишера-Йейтса довольно проста и эффективна.

Если вы не хотите иметь дело с 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 голосов
/ 17 декабря 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...