Dobrý den. Potřeboval bych poradit jak získat náhodné číslo v určitém rozsahu (třeba od 0-100). A ještě lepší by bylo, kdyby šance získat větší číslo byla čím dál menší (jakože by bylo daleko pravděpodobnější, že získám číslo 5 než třeba 86). Předem děkuji.
Fórum › .NET
C# Náhodné číslo (od až po)
A ještě bych měl jednu otázku, snad nebude vadit že už je to mimo téma. Chtěl bych udělat ve Visual Studiu Express Form s postranním menu, kde by se měnil pouze obsah (Střed v okně) díky poklepávání na tlačítka v menu. Chtěl jsem na sebe naskládat několik vrstev "Panel", které by se jenom zviditelňovali a zneviditelňovali, ale bylo by to dost nepřehledné. Trochu jsem googlil ale neumím tenhle problém v aj dostatečně popsat. Nejlepší by bylo, kdybych na každej obsah jednotlivě při tvorbě viděl (něco jakobych měl několik různejch formů) jen v závěru by se zobrazovali na stejném místě. Předem děkuji za radu.
ked potrebujem ja vytvorit nahodne cisla tak aby boli mensie pravdepodobnejsie tak pouzivam nasledovny algoritmus v C# nerobim ale snad princip bude jasny :D
int max = 50; // chcem nahodne cislo od 0 do 50 :)
Random nh = new Random();
int r = nh.Next(0, 1000001);
double d = r/1000000.0;
int vysledok = d*d*max; //ak chces este pravdepodobnejsie mensie cisla tak d mozes dat az na tretiu alebo piatu...
#8 nergal
zajimavý řešení, ale má dost vělkou pravděpodobnost na čísla do 40 (ze 100), tohle je vysledek z 1M pokusu.. na hodnotu 100 máš šanci 1:1000000 a hodnota 0 je podstate 1:10
// hodnota => počet
0 => 100454
1 => 41478
2 => 31704
3 => 26853
4 => 23509
5 => 21172
6 => 19673
7 => 18370
8 => 17228
9 => 16351
10 => 15446
11 => 14797
12 => 13844
13 => 13725
14 => 13206
15 => 12638
16 => 12224
17 => 11801
18 => 11685
19 => 11328
20 => 11030
21 => 10783
22 => 10525
23 => 10320
24 => 10019
25 => 9935
26 => 9544
27 => 9538
28 => 9216
29 => 9238
30 => 8990
31 => 8942
32 => 8738
33 => 8764
34 => 8502
35 => 8482
36 => 8281
37 => 8008
38 => 8079
39 => 7949
40 => 7960
41 => 7758
42 => 7742
43 => 7451
44 => 7457
45 => 7569
46 => 7301
47 => 7218
48 => 7196
49 => 6880
50 => 6931
51 => 7037
52 => 6937
53 => 6737
54 => 6907
55 => 6851
56 => 6657
57 => 6545
58 => 6500
59 => 6493
60 => 6409
61 => 6382
62 => 6466
63 => 6189
64 => 6037
65 => 6280
66 => 6223
67 => 6017
68 => 6111
69 => 5990
70 => 5999
71 => 5836
72 => 5720
73 => 5808
74 => 5745
75 => 5652
76 => 5961
77 => 5745
78 => 5715
79 => 5538
80 => 5448
81 => 5503
82 => 5462
83 => 5573
84 => 5503
85 => 5372
86 => 5406
87 => 5250
88 => 5360
89 => 5325
90 => 5310
91 => 5259
92 => 5155
93 => 5282
94 => 5121
95 => 5211
96 => 5105
97 => 5127
98 => 4861
99 => 5047
100 => 1
trochu jsem si dovolili vylepšit předchozí generátor na náhodnost a řekl bych, že ted je to celkem skoro vyrovnaný
public static int GenerateProbability(Random r, int max, double koef)
{
max++;
int limit = (int)(max * 10);
int n = r.Next((int)(koef * limit), limit);
double d = n / (double)limit;
return (int)(r.NextDouble() * d * max);
}
// pouziti
// jinak "koef", je pevna nahodnost (0-1), kde 0.1 jsou hodnoty do 10 nejpravdepodobnejsi,
// pokud se nastavi 0.5, tak do 50 budou mnohem pravdepodobnejsi nez nad 50
int value = GenerateProbability(r, 100, 0.1);
s timto nastavením výsledek vypadá takto (opět pro 1M generací)
// je videt, ze diky koef. jsou hodnoty od 0-10 mnohem pravdepodobnejsi a az
// potom se zecnou pomalu snizovat.. je pravda, ze ta 100 ma malou sanci, ale neni to tak
// strasny jako predtim :)
0 => 25298
1 => 25575
2 => 25536
3 => 25540
4 => 25521
5 => 25407
6 => 25447
7 => 25121
8 => 25315
9 => 25310
10 => 25123
11 => 24093
12 => 23006
13 => 21954
14 => 21270
15 => 20682
16 => 20113
17 => 19376
18 => 18534
19 => 18045
20 => 17547
21 => 16932
22 => 16722
23 => 16192
24 => 15696
25 => 15074
26 => 14546
27 => 14277
28 => 14042
29 => 13484
30 => 13072
31 => 12835
32 => 12456
33 => 11935
34 => 11722
35 => 11538
36 => 11213
37 => 10763
38 => 10614
39 => 10336
40 => 10020
41 => 9772
42 => 9408
43 => 9177
44 => 8970
45 => 8885
46 => 8496
47 => 8296
48 => 8124
49 => 7866
50 => 7489
51 => 7484
52 => 7105
53 => 7024
54 => 6767
55 => 6683
56 => 6369
57 => 6221
58 => 6167
59 => 6047
60 => 5527
61 => 5426
62 => 5322
63 => 4922
64 => 5092
65 => 4753
66 => 4583
67 => 4322
68 => 4224
69 => 4055
70 => 3928
71 => 3819
72 => 3692
73 => 3503
74 => 3320
75 => 3233
76 => 3012
77 => 2897
78 => 2689
79 => 2540
80 => 2543
81 => 2336
82 => 2235
83 => 2108
84 => 1902
85 => 1819
86 => 1672
87 => 1532
88 => 1410
89 => 1336
90 => 1176
91 => 1092
92 => 901
93 => 849
94 => 667
95 => 570
96 => 472
97 => 395
98 => 283
99 => 156
100 => 55
#7 JoDiK
Ještě se vrátím k těm původním random hodnotám. Jak udělat, aby to po každé, když zmáčknu tlačítko přičetlo jinou náhodnou hodnotu? Jde o to že se vlastně po spuštění programu nastaví náhodná hodnota, která se pak pořád stejně přičítá.třeba 24 a pak se stále přičítá už jen 24.
musíš si tu náhodnou hodnotu generovat vždy při stisku tlačítka?
#11 Gandy
Stačí v konstruktoru Random zadat nějakou "pokaždé jinou" hodnotu, např.
Random _r = new Random(System.Environment.TickCount);
Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Náhodné číslo — založil Jakub Vojáček
Nahodne cislo — založil Zelenáč
Náhodné číslo — založil paking
Náhodné číslo — založil Xiaxo
Nahodne cislo — založil Marek Čačko
Moderátoři diskuze