Liczyby Losowane

0

Mam problem ponieważ nigdzie nie znalazłem konkretnej informacji na temat losowania liczb

Nie wiem jak w C# 2005 express napisać żeby funkcja losowała 20 z 80 liczb i żeby oczywiście się nie powtarzały ?? kto ma pomysł ??

pozdro dla Moderatorów

0

klasa Random

0

tyle to sam się dowiedzialem ale może by tak kod napisał

0

Random randObj = new Random();
int wynik;
for(int i=0; i!=20;i++) wynik= randObj.Next(80+1);

0

mam dobre serce xd

type
macierz=array[1....x] of integer;

/////////////////////////////////////////
procedure (tablica:macierz,ilosc:word);
var
i,rando,x:word;
tablicao:macierz
tablica1:array[1...ilosc] of integer;
begin
   tablicao:=tablica;{zapisz jakos inaczej}
   for i:=1 to ilosc do{ile razy}
   begin
   rando:=random(ilosc+1);{losuj }
      if not tablica[rando]=-332768 then {jesli nie użyto to }
       begin
          inc[x];{zwienksz zeby niezapisywać do tego samego}
          tablica1[x]:=tablica[rando];{wpisz z tego do tego xd}
          tablica[rando]:=-332768{takiej wartosci niebendziesz mial co ?}
        end
      else dec(i);{jesli uzyto to "cofnij" licznik}
 
   end;
end;

jeśli gdzies palłem sie to zignorujcie to ^^

0

Neon thx ale mam jeszcze pytanie do ciebie jak zarobić aby nie losowało zera i liczby sie nie powtarzały ?

0

Zrob sobie tablice 80 elementow z wartosciami 1-80, nastepnie 20 razy wylosuj indeksy i za kazdym razem zamieniaj wylosowany element z ostatnim i losuj indeksy z zakresu o jeden mniej.

Czyli przykladowo dla

1 2 3 4 5 6 7 8 9 10
losujesz indeksy z zakresu 0-9
wylosowany indeks to np. 5

przestawiasz wylosowany z ostatnim

1 2 3 4 5 10 7 8 9 5

i losujesz z zakresu 0-8, itp. Jak wylosujesz tak np. 4 razy to ostatnie 4 elementy to elementy wylosowane, wiec nie musisz ich juz zapamietywac gdzie indziej. Oczywiscie metoda jest sensowna dla malych zakresow, jak tutaj.

0

No tak wszystko fajnie ale na 80 liczb to NIE MA sensu

0
gorylla napisał(a)

No tak wszystko fajnie ale na 80 liczb to NIE MA sensu

bo?

0

BO sam nie wiem hehe :-(

0

A jak przestawic te liczby ??

0

Geez, chyba masz srednio pojecie o programowaniu...

int []tab; ... int randomIndex = ... int temp = tab[lastIndex]; tab[lastIndex] = tab[chosenIndex]; tab[chosenIndex] = temp; ```
0

NO nawet średnie to dużo napisane ale mógłbyś połączyć

Random randObj = new Random();
int wynik;
for (int i = 0; i != 20; i++)
{
wynik = randObj.Next(80 + 1);

Z tym

int []tab;
..
int randomIndex = ...
int temp = tab[lastIndex];
tab[lastIndex] = tab[chosenIndex];
tab[chosenIndex] = temp;

BO coś mi nie wychodzi

0

No widze wlasnie...

Sprobuj tak:

int [] GenerateRandoms(int iNumber, int iRangeBegin, int iRangeEnd)
{
int [] Numbers = new int[iRangeEnd - iRangeBegin + 1];
int i;
for(i = 0; i < Numbers.Length; i++)
Numbers[i] = iRangeBegin + i; //wypelnianie tablicy
Random RandomGenerator = new Random(DateTime.Now.Miliseconds);
int LastIndex = Numbers.Length;
for(i = i; i < iNumber; i++)
{
int ChosenIndex = RandomGenerator.Next(LastIndex);
int Temp = Numbers[ChosenIndex];
Numbers[ChosenIndex] = Numbers[LastIndex];
Numbers[LastIndex] = Temp;
LastIndex--;
}

int [] Result = new int[iNumber];
Array.Copy(Numbers, Numbers.Length - iNumber - 1, Result, 0, iNumber);
return Result;
}


Disclaimer: Pisane z palca, moze nie dzialac, ale idea zachowana :)
0

Coś nie działa a poza tym są błędy a nieda sie jakoś prościej ??

0

A to jest trudniej? Da sie, ale sam postawiles takie wymagania, wiec... Jakie bledy? Nie jestem jasnowidzem. Poza tym jak juz Ci kompilator napisal co jest nie tak, to sie postaraj i popraw. Jak na razie to liczysz na gotowe rozwiazanie - dostales je i dalej marudzisz...

0

Cały czas próbuje abym zrobil to na kliknięcie przycisku

private void button3_Click(object sender, EventArgs e)
{}// (czemu tak bo jeżeli skasuje {} to domaga się ; i potme bo już lawina błędów)

         int [] GenerateRandoms(int iNumber, int iRangeBegin, int iRangeEnd)
            {
                int [] Numbers = new int[iRangeEnd - iRangeBegin + 1];
                int i;
                for(i = 0; i < Numbers.Length; i++)
                Numbers[i] = iRangeBegin + i; //wypelnianie tablicy
                Random RandomGenerator = new Random(DateTime.Now.Miliseconds);
                int LastIndex = Numbers.Length;
                for(i = i; i < iNumber; i++)
                    {
                        int ChosenIndex = RandomGenerator.Next(LastIndex);
                        int Temp = Numbers[ChosenIndex];
                        Numbers[ChosenIndex] = Numbers[LastIndex];
                        Numbers[LastIndex] = Temp;
                        LastIndex--;
                    }

                  int [] Result = new int[iNumber];
                  Array.Copy(Numbers, Numbers.Length - iNumber - 1, Result, 0, iNumber);
                  richTextBox5.AppendText(Convert.ToString(Result) + " ");
                  return Result;
            }

a oto error :

Error 1 'System.DateTime' does not contain a definition for 'Miliseconds'

0

I NIE ZE JESTEM N00BEM I NIC MI SIE NIECH MYSLEC ALE JUZ NIEMAM SIL DO TEGO A JESTEM DIPIERO POCZATUJACYM I PRESZE O WYROZUMIALOSC :d BO TYLE CO PRESZUKALEM TO CHYBA MALO KTO TYLE PRZESZUKAL

0

Sweet Jesus...

Nie wklejaj tego doslownie tylko pomysl. To co napisalem to metoda - takie cos jak w innych jezykach funkcja. Tresc i dzialanie zamkniete pod konkretna nazwa. Definiujesz sobie takie cos gdzies w klasie i nastepnie:

//jakas inna metoda, niech bedzie zdarzenie klika ... int [] wylosowane = GenerateRandoms(20, 1, 80); ``` w tablicy wylosowane masz teraz wynik dzialania tej metody, czyli 20 liczb (a wiec tablica 20-elementowa) z zakresu 1-80.

Co do Miliseconds to wystarczylo zerknac do dokumentacji, zeby stwierdzic, ze sie machnalem delikatnie: ma byc Millisecond.

0

Dam sobie może na razie spokój z tym powrócę do tego za jakiś czas z <ort>świerzością </ort>i może przez ten czas sie trochę poduczę ;]

0

Najpierw to sie naucz programowac w C#, a nie klikac w visual studio - jest spora roznica. Dowiedz sie co to sa petle, instrukcje warunkowe, funkcje, klasy, obiekty, metody, itp.

0

JAKIE polecasz książki bo mam

SEKRETY JĘZYKA C#

0

Trudno mi powiedziec, bo rzadko korzystam z ksiazek. Programowania nauczylem sie juz wczesniej, teraz wystarcza dokumentacja i google. W kazdym razie znajdz sobie ksiazke o programowaniu, a nie o Visual Studio czy cos podobnego. I nie zniechecaj sie pisaniem programow konsolowych, bo wbrew pozorom przeskoczenie z konsolowego na graficzne to tylko roznica w wygladzie - jezeli ktos umie programowac, a nie klikac w przycisku w srodowisku programowania.

0

Witam pogłówkowałem troszkę i wszystko działa (czuje sie dumny :d :d )

Random randObj = new Random();
int wynik;
for (int i = 0; i != 20; i++)
{
wynik = randObj.Next(1, 80 + 1);
richTextBox5.AppendText(Convert.ToString(wynik) + " ");
if (wynik != wynik)

                richTextBox5.AppendText(Convert.ToString(wynik) + " ");
            else
                wynik = randObj.Next(1, 80 + 1);
                
        }
            richTextBox5.AppendText("\n");
0

Rozwiązałem ten problem jeszcze inaczej:

using System;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace ConsoleApplication1
{
class Program
{
static void Main(string[] args)
{
ArrayList liczby = new ArrayList();
Random r = new Random();
int liczba = r.Next(1, 81);
liczby.Add(liczba);
do
{
liczba = r.Next(1, 81);
if (!liczby.Contains(liczba))
{
liczby.Add(liczba);
}
}
while (liczby.Count != 20);
{
for (int i = 0; i < liczby.Count; i++)
{
Console.WriteLine(i + 1 + ". " + liczby[i]);
}
}
}
}
}

Pozdrawiam!

0

@gorylla: nie kumam tego fragmentu

if (wynik != wynik)

przeciez ta sama zmienna zawsze jest sobie rowna...

@Kuba90: w pesymistycznym przypadku czas wykonania tego kodu dazy do nieskonczonosci...
0

static void Main(string[] args)
{
int[] tab = new int [20];
Random los = new Random ();
for( int i = 0; i<tab.Length ; i++)
{
tab[i]= los.Next (1,80);
for (int j= 0; j<i; j++)
{
if (tab[i]== tab[j])
{
i--;
}
}
}
foreach(int a in tab)
{
Console.Write ("{0} ", a);
}

proszę bardzo

0

Można przyspieszyć działanie programu dodając w drugiej pętli instrukcje "break". Otóż więcej niż dwa elementy tablicy nie mogą być takie same.

0
Kuba90 napisał(a)

Można przyspieszyć działanie programu dodając w drugiej pętli instrukcje "break". Otóż więcej niż dwa elementy tablicy nie mogą być takie same.

Ale założenie było takie że żaden element nie może się powtarzać, więc nie mogą być dwa elementy takie same.

0

Jeżeli już powtórzą się jakieś elementy tablicy to na tym można zakończyć działanie pętli ponieważ trzy elementy nie mogą być takie same. To znacznie przyspiesza działanie programu.

static void Main(string[] args)
{
int[] tab = new int[50000];
Random r = new Random();
for (int a = 0; a < tab.Length; a++)
{
tab[a] = r.Next(1, 50001);
for (int b = 0; b < a; b++)
{
if (tab[a] == tab[b])
{
a--;
break;
}
}
}
foreach (int x in tab)
{
Console.WriteLine("{0}, x);
}
}

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