losowe rozmieszczenie elementów tablicy[C]

0

Witam!
Muszę napisać program w C, który losuje 50 liczb wymiernych z danego przedziału, przypisuje je do tablicy, a następnie losowo przypisuje do innej tablicy.
Otóż siedzę nad tym programem już sporo czasu i mam problem - doszedłem do momentu wylosowania 50 liczb wymiernych z tego przedziału ale nie umiem losowo je przypisać do innej tablicy - wiem, że należy wykorzystać tutaj losowanie bez powtórzeń - przejrzałem chyba wszystkie możliwe tematy na różnych forach - było mnostwo sposobow ale mam problem z ich zrozumieniem - dlatego mam prośbę czy może ktoś napisać mi jak najlepiej zrozumiale jak napisać fragment kodu, który by działał według zasady:
-losuje liczbe z zakresu od 0 do 49
-pierwszemu elementowi wczesniej utworzonej tablicy przyporzadkowuje indeks wczesniej wylosowany, który będzie jego pozycją w drugiej tablicy
-i tak dalej z uwzględnieniem faktu, że każde kolejne losowanie musi wykluczać liczby już wcześniej wylosowane

Z góry dziękuje i liczę na wyrozumiałość;)

0

dzięki za szybką odpowiedź, ale powiem szczerze nie słyszałem w ogólę o takich funkcjach: a wolałbym to zrobić jakąs bardziej podstawową metodą.

0

a mógłbyś jakoś przykładowo napisać taki kod bo sam nie za bardzo rozumiem

0

Ta funkcja pseudolosowo zmienia kolejność elementów w tablicy. Typ możesz zmieniać wg potrzeb.

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

typedef double typ;

void losuj(typ *tab, unsigned int rozmiar)
{
	unsigned int i, l;
	typ pom;
	srand(time(NULL));
	for (i = 0; i + 1 < rozmiar; i++)
	{
		l = (rand() % (rozmiar - i)) + i;
		if (l != i)
		{
			pom = tab[i];
			tab[i] = tab[l];
			tab[l] = pom;
		}
	}
}
0

Hmm.. ciekawie to wygląda ale wolalbym coś "prymitywnego" - mam pomysł żeby najpierw pomieszać tablicę liczb od 0 do 49 i potem po kolei je elementy traktować jako indeksy i przypisywac je liczba wymiernym ktore wczesniej wylosowalem
zaczalem pisac cos takiego:

  for(i=0;i<rozmiar;i++)
   { indeks=rand()%rozmiar;
    a[i]=indeks;
    for(k=0;k<=i;k++)
    {if (a[i]==a[i-k]) 

tyko to jest nie dokonczone i chyba ostatnia petla cos nie tak by dzialala, dlatego bylbym wdzieczny za modyfikacje takiego prostego kodu
:)

0

Hmm napisałem jeszcze coś takiego: tylko czy to może być:

 for (i=0; i<rozmiar; i++)
  a[i] = i;
  for (i=0; i<rozmiar; i++)
{
  indeks = rand()%rozmiar;
  temp = a[i];
  a[i] = a[indeks];
  a[indeks] = temp;
}
for (i=0; i<rozmiar; i++)

printf("%d", a[i]);
0

Przepraszam za ciągłe posty, ale cały czas siedzę nad programem i choć widzę minimalny postęp mam nadal pewne wątpliwości:
Otóż tak jak napisałem wylosowałem "rozmiar" liczb wymiernych z zakresu 3-10 umieściłem je w tablicy, następnie moim zadaniem jest pomieszanie tablicy.
Tak jak wczesniej napisałem stworzyłem tablicę pomocniczą zwierającą w kolejności liczby od 0 do rozmiar-1 i następnie pomieszałem je, i teraz chce przyporządkowac wartości z tej tablicy pomocniczej jako indeksy kolejnych elementów liczb wymiernych - tylko nie wiem jak, przedstawiam kod , który jak na razie otrzymałem:

 #include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define rozmiar 5

int i, p, q, licznik, indeks, temp, temp2;
double tab[rozmiar];
int a[rozmiar];
double w;
int main()
{   srand( (unsigned) time( NULL ) );

    licznik=0;
    for(i=0; licznik<rozmiar ;i++)
    {
             p=rand()+1;  
             q=rand()+1;  
             w=p/(double)q;
    if ((w>3) && (w<10))
    {
    licznik++;
    tab[licznik]=w;
    printf("w=%0.4lf\n", tab[licznik]);
    }
    }
    
    for (i=0; i<rozmiar; i++)
  a[i] = i;
  
  for (i=0; i<rozmiar; i++)
{
  indeks = rand()%rozmiar;
  temp = a[i];
  a[i] = a[indeks];
  a[indeks] = temp;
}
for (i=0; i<rozmiar; i++)
printf("\n%d\n", a[i]);

 system("PAUSE");	
  return 0;
}
0

dlaczego coś takiego nie działa:

 for(i=0;i<rozmiar; i++)
{tab[i]=tab[a[i]];
printf("%0.4lf\t", tab[i]);
}
0

@up powyższe powinno działać jeśli: rozmiar jest mniejszy lub równy rozmiarowi tablicy 'tab' oraz 'a', tablica 'tab' jest tablicą liczb rzeczywistych, tablica 'a' jest tablicą liczb całkowitych przechowujących liczby z zakresu 0 do (rozmiar-1). poza tym printf("%0.4f\t",tab[i]); w większości wypadków powinien wystarczyć, wydaje mi się że lf jest konieczne tylko przy scanfie (chyba że używasz long double to wtedy powinno być Lf - z dużej litery).
http://www.cplusplus.com/reference/clibrary/cstdio/printf/

0

tak rozmiar tablicy a jest taki sam jak rozmiar tablicy tab - tylko ze taki zapis nie jest poprawny, bo mimo tego, że się kompiluje to jeżeli np elementowi 1 przypiszemy indeks załóżmy 5, to potem elementowi 5 też przypisujemy jakis indeks i wychodzą głupoty np kilka rzy ta sama liczba itp. czy istnieje jakis inny sposob na przypisanie liczb z tablicy pomieszanej a jako indeksy do elementów tablicy tab?
P.S Tak się zastanawiam czy koniecznie jest wprowadzenie tablicy a czy nie możnaby było według tego samego sposobu pomieszać juz tablice tab? Tylko niestety nie wiem jak, stąd ten z pozou dziwny pomysł z wprowadzeniem tablicy a

p.s
A gdyby wprowadzić nową tablicę i byłoby cos takiego:

 for(i=0;i<rozmiar; i++)
{tab[i]=tab2[a[i]];
printf("%0.4f\t", tab2[i]);
}

co tym razem ejst nie tak?

0

Dobra doszedłem jak to zrobić, dzięki za wszystkie wskazówki, wbrew zdaniom niektórych użytkowników forum mój problem nie wziął się z lenistwa ale z braku doświadczenia i niewiedzy - jako, że nie jestem na kierunku informatycznym, a krwq uwierz mi, że spędziłem spoooro czasu

0

też nie jestem na kierunku informatycznym. jak prosisz o pomoc to albo proś o konkrety (szczegóły dotyczące języka, podpowiedź jaki algorytm itp.) albo pokaż co zrobiłeś, a nie prosisz o całe zadanie.

1 użytkowników online, w tym zalogowanych: 0, gości: 1