Skocz do zawartości


Uwaga, ta strona używa Cookies
Stosujemy je, aby ułatwić Tobie korzystanie z naszego serwisu. Pamiętaj, że w każdej chwili możesz zmienić ustawienia dotyczące Cookies w ustawieniach swojej przeglądarki internetowej.
Dowiedz się więcej    
Akceptuję

AccessViolation

Rejestracja: 29 cze 2012
OFFLINE Ostatnio: 19 wrz 2016 16:44
-----

#883549 Jak wypełnić tablicę losowymi liczbami z wybranego przedziału?

Napisane przez AccessViolation w 02 marzec 2013 - 23:06

By wylosować liczbę z danego przedziału wykorzystując funkcję rand() trzeba skorzystać z niej w następujący sposób

 

(rand() % L_ELEM)+MIN

gdzie L_ELEM to liczba elementów w przedziale, a MIN to najniższa wartość losowania. Załóżmy, że funkcja rand() w wyrażeniu (rand()%10)+1 zwraca 57. Reszta z dzielenia przez 10 wynosi 7, a do tego dodajemy 1 - wynik 8. A teraz rand zwraca 60 - reszta - 0 plus 1 wychodzi 1. Jeśli chcesz wylosować liczbę z przedziału <5, 12> trzeba policzyć ile liczb całkowitych mieści się w tym przedziale. W tym przypadku będzie to 8. Najniższa wartość z przedziału wynosi 5, więc działanie na wartości zwracanej przez rand() będzie wyglądało tak:

 

(rand() % 8)+5

  • 1


#882917 Jak wypełnić tablicę losowymi liczbami z wybranego przedziału?

Napisane przez AccessViolation w 02 marzec 2013 - 16:29

#include <stdio.h>
#include <time.h>
#include <random>
 
int main(int argc, char* argv[])
{
srand(time(NULL));
int macierz[10][10];
int x, y;
 
for(;;) //Powtarzam bez końca dopóki użytkownik nie wprowadzi prawidłowych parametrów
{
//Pobieram współrzędne x i y.
printf("Podaj wspolrzedna x: ");
scanf("%d", &x);
if(x > 10 || x < 1) //Sprawdzam czy x mieści się w przedziale
{
printf("Nieprawidłowy parametr! \n");
continue;
}
printf("Podaj wspolrzedna y: ");
scanf("%d", &y);
if(y > 10 || y < 1) //Sprawdzam czy y mieści się w przedziale
{
printf("Nieprawidlowy parametr! \n");
continue;
}
 
 
//Wypisuję wszystkie wartości by móc sprawdzić poprawność wyniku
printf("Wizualny poglad tablicy\n\n");
printf("\t\t Os Y\n");
printf("|01||02||03||04||05||06||07||08||09||10|\n \
-----------------------------------------\n \
-----------------------------------------\n");
for(int i = 0; i < 10; ++i)
{
for(int j = 0; j < 10; ++j)
{
macierz[i][j] = (rand() % 10)+1; //wypełniam macierz liczbami z przedziału <1, 10>
if(macierz[i][j] < 10)
printf("|0%d|", macierz[i][j]); 
 
else
printf("|%d|", macierz[i][j]);
}
printf("-----%d \t os X \n---------------------------------\n", i+1); //wiem wiem... nie wygląda to ciekawie}
int suma = 0; //tutaj zapisuję wynik
for(int i = x-1, j = y-1; i >= 0 && j >= 0; --i, --j) //przemieszczam się po pierwszej przekątnej
suma += macierz[i][j];
 
for(int i = x, j = y; i < 10 && j < 10; ++i, ++j) //dodaję do x i y jeden, by nie policzyć dwa razy tej samej komórki
suma += macierz[i][j];
 
for(int i = x-2, j = y; i >= 0 && j < 10; --i, ++j)
suma += macierz[i][j];
 
for(int i = x, j = y-2; i < 10 && j >= 0; ++i, --j)
suma += macierz[i][j];
 
printf("Suma elementow po przekatnych przecinajacych sie w punktach x = %d, y = %d wynosi %d.\n",
x, y, suma); //wypisuję rezultat
break;
}
system("pause");
return 0;
}

 

Najgorsze wydają się być cztery ostatnie pętle for. To nic innego jak przemieszczanie się po przekątnej i sprawdzenie, czy nie wyszliśmy poza zakres.

Pewnie są znacznie lepsze sposoby, lecz ten ma na celu przedstawienie wyłącznie koncepcji.


  • 1