Avatar
Vojtěch Dupal:

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. září 18:31
Avatar
David Endrych:

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. září 18:33
Avatar
Odpovídá na David Endrych
Vojtěch Dupal:

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. září 18:36
 
Nahoru Odpovědět 25. září 18:34
Avatar
Odpovídá na Vojtěch Dupal
Luboš Běhounek (Satik):

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  +6 25. září 18:36
:)
Avatar
Odpovídá na Vojtěch Dupal
David Endrych:

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

 
Nahoru Odpovědět  ±0 25. září 18:45
Avatar
Petr Stastny
Redaktor
Avatar
Odpovídá na Vojtěch Dupal
Petr Stastny:

Presne tak:

Int[] poleZakazanychCisel

Do {

Vygeneruj cislo

} while(pole obsahuje vygenerovane cislo)

Sry za kod jsem na mobilu

 
Nahoru Odpovědět 25. září 21:29
Avatar
DZetko
Člen
Avatar
DZetko:
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. září 23:43
Avatar
DZetko
Člen
Avatar
DZetko:

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  -1 26. září 23:58
Avatar
Odpovídá na DZetko
Luboš Běhounek (Satik):

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. září 9:38
:)
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Vojtěch Dupal
DarkCoder:

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. října 17:34
Avatar
coells
Redaktor
Avatar
Odpovídá na DarkCoder
coells:

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. října 18:37
 
Nahoru Odpovědět 3. října 18:35
Avatar
DarkCoder
Člen
Avatar
Odpovídá na coells
DarkCoder:

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. října 20:33
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.