IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Vojtěch Dupal:25.9.2016 18:31

Ahoj, jak byste vypsali radom čislo v rozmezi 0 až 100, napřiklad bez čisla 9? Potřebuji udělat vyjimku aby se tam par čisel neobjevilo.

 
Odpovědět
25.9.2016 18:31
Avatar
David
Člen
Avatar
David :25.9.2016 18:33

Tak po vygenerování dej podmínku na ty čísla, které nechceš a pokud se bude rovnat tak vygeneruješ nové číslo

 
Nahoru Odpovědět
25.9.2016 18:33
Avatar
Odpovídá na David
Vojtěch Dupal:25.9.2016 18:34

A co když se objeví zase to stejný čislo a nebo jedno z těch dalších co se tam nemaji vypsat? :D

Editováno 25.9.2016 18:36
 
Nahoru Odpovědět
25.9.2016 18:34
Avatar
Odpovídá na Vojtěch Dupal
Luboš Běhounek Satik:25.9.2016 18:36

Pokud tech cisel neni moc, tak nejjednodussi je udelat pole, v kterym budes mit jen ty pole dovolenych cisel a tim randoimem budes hledat index do tohohle pole.

Nahoru Odpovědět
25.9.2016 18:36
https://www.facebook.com/peasantsandcastles/
Avatar
David
Člen
Avatar
Odpovídá na Vojtěch Dupal
David :25.9.2016 18:45

prostě tam dej cyklus dokud to nebude to správné číslo

 
Nahoru Odpovědět
25.9.2016 18:45
Avatar
Petr Šťastný
Tvůrce
Avatar
Odpovídá na Vojtěch Dupal
Petr Šťastný:25.9.2016 21:29

Presne tak:

Int[] poleZakazanychCisel

Do {

Vygeneruj cislo

} while(pole obsahuje vygenerovane cislo)

Sry za kod jsem na mobilu

 
Nahoru Odpovědět
25.9.2016 21:29
Avatar
DZetko
Člen
Avatar
DZetko:26.9.2016 23:43
int[] forbiddenNumbers = new int { ... };

bool success = false;

while (!success)
{
        int number = generateNumber();
        if (isNumberValid(number))
        {
                success = true;
        }
}

public void GenerateNumber()
{
        int.Random();
}
 
Nahoru Odpovědět
26.9.2016 23:43
Avatar
DZetko
Člen
Avatar
DZetko:26.9.2016 23:58

Tak znovu, překročil jsem časový limit na editaci. Tohle by už mělo fungovat.

class Program
{
        static void Main(string[] args)
        {
            List<int> forbiddenNumbers = new List<int>() {2,3};
            bool success = false;
            int number = 0;

            number = GenerateNumber();
            while (!success)
            {
                if (!forbiddenNumbers.Contains(number))
                {
                    success = true;
                    Console.WriteLine("Result: " + number);
                }
                number = GenerateNumber();
            }
            Console.ReadLine();
        }

        public static int GenerateNumber()
        {
            Random random = new Random();
            return random.Next(5);
        }
}
 
Nahoru Odpovědět
26.9.2016 23:58
Avatar
Odpovídá na DZetko
Luboš Běhounek Satik:27.9.2016 9:38

Vytvaret instanci tridy Random pri generovani kazdyho cisla neni dobrej napad, i kvuli tomu, ze behem kazdy milisekundy (tam bez problemu stihnes vygenerovat tisice nahodnych cisel) budes dostavat porad dokola to samy nahodny cislo, protoze ten Random bude mit stejnej seed.

Nahoru Odpovědět
27.9.2016 9:38
https://www.facebook.com/peasantsandcastles/
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Vojtěch Dupal
DarkCoder:3.10.2016 17:34

V čem je problém? Jakým způsobem to řešit již naznačil Satik ve svém prvním příspěvku. Já jen doplním, že trik spočívá v nahrazování čísla s výjimkou aktuálně posledním platným číslem. Modifikované pole je pak základem pro výběr náhodného čísla v modifikovaném rozsahu. Viz kód..

/* Nahodne cislo v rozsahu 0-MAX s omezenim */

#define _CRT_SECURE_NO_WARNINGS

#include <stdio.h> // printf()
#include <stdlib.h> // rand(), srand()
#include <time.h> // time()

#define DEBUG 0
#define MAX 100

int main(int argc, char *argv[]) {
        int i, pos = MAX - 1, nbanned;
        int accept[MAX];
        int banned[] = { 9, 15, 23, 48, 71 };

        srand((unsigned int)time(NULL));
        printf("Nahodne cislo v rozsahu 0-MAX s omezenim\n\n");
        for (i = 0; i < MAX; i++) accept[i] = i;
        nbanned = sizeof(banned) / sizeof(int);
        for (i = 0; i < nbanned; i++) {
                accept[banned[i]] = accept[pos];
                pos--;
        }

        #if (DEBUG)
                for (i = 0; i < MAX; i++) printf("%d ", accept[i]);
                printf("\n\nnbanned: %d, pos: %d\n\n", nbanned, pos);
        #endif

        printf("Nahodne cislo: %d\n", rand() % pos);
        return 0;
}
Nahoru Odpovědět
3.10.2016 17:34
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
coells
Tvůrce
Avatar
Odpovídá na DarkCoder
coells:3.10.2016 18:35

Hlavní problém je v tom, že to nebude fungovat.
Použitím tvé myšlenky: mám čísla {0, 1, ..., 98, 99} a zakážu hodnoty {0, 99} - výsledkem je, že povolíš {99, 1, 2, ..., 97}.

Pokud je zakázaných čísel méně než polovina celkového rozsahu, je nejjednodušší generovat náhodná čísla, dokud nedostanu číslo povolené. Máme <2 očekávané pokusy per vygenerované číslo se standardní odchylkou <1.4 a v 99% případů budeme pod 6 pokusy.

Editováno 3.10.2016 18:37
 
Nahoru Odpovědět
3.10.2016 18:35
Avatar
DarkCoder
Člen
Avatar
Odpovídá na coells
DarkCoder:3.10.2016 20:33

Správná připomínka, děkuji. V případě vícero zakázaných čísel nelze pracovat s číslem které je zakázané. Nahrazovat zakázané číslo povoleným číslem lze tak, že budeme přistupovat k seznamu zakázaných čísel odzadu (pochopitelně za předpokladu, že je tento seznam setříděný) a aplikovat stejný princip. Viz upravený úryvek kódu..

srand((unsigned int)time(NULL));
        printf("Nahodne cislo v rozsahu 0-MAX s omezenim\n\n");
        for (i = 0; i < pos + 1; i++) accept[i] = i;
        nbanned = sizeof(banned) / sizeof(int);
        printf("Zakazana cisla: ");
        for (i = 0; i < nbanned; i++) printf("%d ", banned[i]);

        #if (DEBUG)
                printf("\n\nnbanned: %d\n\n", nbanned);
                printf("pred modifikaci\n\n");
                printf("pos: %d\n", pos);
                for (i = 0; i < pos + 1; i++) printf("%d ", accept[i]);
        #endif

        for (i = nbanned; i; i--) {
                accept[banned[i-1]] = accept[pos];
                pos--;
        }

        #if (DEBUG)
                printf("\n\npo modifikaci\n\n");
                printf("pos: %d\n", pos);
                for (i = 0; i < pos + 1; i++) printf("%d ", accept[i]);
        #endif

        printf("\n\nNahodne cislo: %d\n", rand() % pos);

K druhému bodu. Nejjednodušší to je, to ano, ale takto bych to rozhodně neřešil a to ze dvou prostých důvodů, které spolu vzájemně souvisí - pravděpodobnosti a tím i efektivity. Se vzrůstajícím počtem zakázaných čísel vzniká vyšší pravděpodobnost, že se netrefím do povoleného čísla a budu muset tak znovu generovat nové číslo. Počet generování náhodného čísla kvůli jednomu náhodnému číslu se tak obrovsky zvyšuje. I přes možnost, že jsem schopen vykonat za krátký časový interval dost těchto výpočtů, bych to takto neřešil.

Nahoru Odpovědět
3.10.2016 20:33
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 12 zpráv z 12.