Diskuze: Random čisla s vyjimkou?
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
Člen
Zobrazeno 12 zpráv z 12.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Test znalostí C# .NET online, jsme si ověřili nabyté zkušenosti z kurzu.
A co když se objeví zase to stejný čislo a nebo jedno z těch dalších co se tam nemaji vypsat?
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.
prostě tam dej cyklus dokud to nebude to správné číslo
Presne tak:
Int[] poleZakazanychCisel
Do {
Vygeneruj cislo
} while(pole obsahuje vygenerovane cislo)
Sry za kod jsem na mobilu
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);
}
}
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.
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;
}
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.
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.
Zobrazeno 12 zpráv z 12.