Ustvarjanje naključnih datumov v 1 s. Naključje, naključje, vzorec

21
//Funkcija ustvari lahko berljivo predstavitev vrednosti. // Primeri oblikovanja številk ValueFormat = Format(123456.789, " NRT=10; NRT=2"); //ValueFormat = "123.456,79"ValueFormat = Format(123456.789, "HH=0; NHV=2"); //Vrednost 16
Iskanje po celotnem besedilu - omogoča vam iskanje besedilnih informacij, ki se nahajajo skoraj kjer koli v uporabljeni konfiguraciji. V tem primeru lahko iščete potrebne podatke bodisi po celotni konfiguraciji kot celoti bodisi z zožitvijo... 8
"Točka v času" je virtualno polje, ki ni shranjeno v bazi podatkov. Vsebuje objekt Točka v času (ki vključuje datum in POVEZAVO DO DOKUMENTA) V 7.7 je obstajal koncept položaja dokumenta, v 8.x Točka v času, da bi dobili... 6
Za 8.x FindByLinks (FindDataByRef) Sintaksa: FindByLinks (Seznam povezav) Parametri: Seznam povezav Zahtevan tip: Array. Matrika s seznamom povezav do objektov, katerih povezave je treba najti. ...


Ključne besede: generator, naključno, števila, število, algoritem, naključno, naključno, porazdelitev, enotna, loterija

Nisem mislil, da bi bilo uporabno v 1C, ampak tukaj ste ... stranke so se odločile za promocijo, kot je "zberi kapice", samo ti moraš zbrati besede, kdor zbere pravilno besedo iz njihovega niza črke zmagajo. Na splošno se zdi naloga preprosta: obstaja abeceda, obstaja določena beseda, ki jo je treba zbrati, na primer "konjak", ima 6 črk, kot lahko vidite.

Morate: ustvariti določeno število naključnih kombinacij šestih črk iz poljubnih črk abecede, temu dodati določeno število možnosti, v katerih je še vedno mogoče dodati besedo, na primer "nkkoya" - beseda je oblikovana, vendar "kavry" očitno ni primeren.

Dodaten pogoj: vse te možnosti (pravilne in ne) morajo biti oštevilčene, da lahko ob prejemu "nagradne" kartice preverite številko (ali je bila).

Zdi se, kaj ima 1C s tem? Tako želijo v računovodski program dodati obračunavanje teh kart in nagrad, hkrati pa so zahtevali generiranje naključnih kombinacij (no, ne pa ročno sestavljanje).
Za vsako promocijo se enkrat generirajo kombinacije, nato pa se na podlagi njih izdelajo karte, t.j. naslednjič bo beseda drugačna itd.

Na splošno se naloga skrči na naslednje:
1. Ustvarite naključna števila, po možnosti z velikim razmikom.
2. S pomočjo številke izračunajte kombinacijo črk (tj. poiščite ujemanje med možnimi kombinacijami in njihovimi številkami).
3. Nasprotna točka od prejšnje - preverite številko kombinacije z besedo.

rešitev:
1. ker generator iz avb in NS je dal majhen razpon naključnih števil, sem moral uporabiti nekoliko drugačen algoritem:

Funkcija Random() if emptyvalue(randSeed) = 1 then randSeed = _getperformancecounter(); endif; randSeed=(a*randSeed+c)%m; vrni randSeed; končna funkcija

Tukaj:
a=1664525; c=1013904223; m=4294967296;
zadnja spremenljivka je 2 na 32. potenco, druga dva sta koeficienta, priporočena za te namene

Največja meja vrednosti 2^32 je bila izbrana na podlagi največjega števila kombinacij (za okrnjeno abecedo z 28 črkami in 7 besedami, ker jih je v resničnem problemu točno 7, bo skupno število kombinacij 28 ^7, torej je izbrana meja približno na sredini intervala, kar je povsem dovolj za vzorčenje 20-30 tisoč možnosti)

Potrebujemo še eno pomožno funkcijo - dvig na pozitivno celo potenco:

Stopnja funkcije (vrednost a, vrednost b, Res=1) Če je b>0, potem Res=Res*a; b=b-1; Stopnja (a,b,Res); Vrni Res; Sicer Vrni Res; endIf; EndFunction

Tukaj: a - osnova stopnje, b - eksponent, Res - rezultat

2. Prepoznavanje razmerja med zaporednimi kombinacijami se je izkazalo za presenetljivo preprosto:

Ko sem razporedil številne elemente po vrstnem redu, sem razkril podobnost razporeditve simbolov s številskim sistemom, le ne decimalnim, ampak v tem primeru "šestnajstiškim" (po številu znakov v nastali "besedi").
Tako je bilo za izračun kombinacije po njenem številu potrebno njeno število pretvoriti v ta sistem številk.

Za naš številski sistem bo osnova potenca šestice, tj. da bi dobili prvo števko na levi, morate število naše kombinacije deliti s 6 na 5. potenco, nato preostanek deljenja s 6 na 4. potenco itd.

Tako dobimo niz šestih številk, ki so v bistvu zaporedne številke črk naše abecede.

Nastala koda:

Funkcija GetCharacters(Pos,TechChar=1 ,SymStr="") Če je TechChar<к Тогда Делитель=Степень(СтрДлина(Буквы),к-ТекСимв); ТекОст=Поз%Делитель; СимСтр=Строка(СимСтр)+Сред(Буквы,Цел(Поз/Делитель+?(ТекОст>0 ,1 ,0 )),1 ); GetSymbols(TekOst,TekSymv+1,SymStr); vrni SimStr; V nasprotnem primeru SimStr=SimStr+Average(Letters,(?(Pos=0 ,StrLength(Letters),Pos)),1); vrni SimStr; endIf; EndFunction

Tukaj:
Pos - število kombinacije (psevdonaključno število)
TechSym - trenutni simbol v obdelavi
SimStr - nastali niz znakov
Črke = niz, ki vsebuje črke abecede v standardnem vrstnem redu ("abv...yuya")
k - število znakov v iskani besedi (v tem primeru = 6)

3. Tudi obratna transformacija je trivialna:

Funkcija GetCombination(Word, TechCharacter=0 , Pos=0 ) NomCharacter=Find(Letters, Medium(Word, to-TechCharacter, 1 )); Če je TechCym>0, potem če je TechSym<к Тогда Поз=Поз+(НомСимв-1 )*Степень(СтрДлина(Буквы),ТекСимв); ПолучитьКомбинацию(Слово,ТекСимв+1 ,Поз); Иначе Возврат Поз; КонецЕсли; Иначе Поз=?(НомСимв=СтрДлина(Буквы),0 ,НомСимв); ПолучитьКомбинацию(Слово,ТекСимв+1 ,Поз); Возврат Поз; КонецЕсли; КонецФункции

Tukaj:
Beseda je kombinacija znakov, katerih število iščemo
TekSymv - trenutni simbol, ki se obdeluje (v bistvu števka šestnajstiškega "števila")
Pos - številka zahtevane kombinacije

Zmešajte N številk:

Za a=1 do N niz zank[a]=a; Konec cikla; Za a=1 do N-1 cikel Cl=Case(a,N); // Naključno celo število v intervalu [a..N] K=matrika[a]; matrika[a]=matrika[Sl]; niz[Sl]=K; EndCycle;

Sc = CreateObject("MSScriptControl.ScriptControl "); Sc.language = "VBscript"; sc.executeStatement("naključno določi"); tukaj bo = Sc.eval("rnd ");

Kako lahko naredim, da so številke naključno izbrane od 1 do 100?

Rand=_GetPerformanceCounter()%(100 +1);
zgleda, da je ta najboljši

Podloga za knjižnico. funkcije, kjer je generator sl. številke:
http://1c.proclub.ru/modules/mydownloads/personal.php?cid=92&lid=2688

V 8.0 lahko uporabite vgrajeni generator GUID za ustvarjanje naključnih števil.
Tu je primer preproste funkcije:

//samo za cela števila Funkcija GetRandomNumber(Min,Max) //namesto Randomize For n = 1 By 100 Cycle Unique = New UniqueIdentifier; EndCycle; //generiraj GUID Unique = AbbrLP(New UniqueIdentifier); //ohrani samo številke Unique = StrReplace(Unique,"- ",""); Unique = StrReplace(Unique,"a ",""); Unique = StrReplace(Unique,"b ",""); Unique = StrReplace(Unique,"c ",""); Unique = StrReplace(Unique,"d ",""); Unique = StrReplace(Unique,"e ",""); Unique = StrReplace(Unique,"f ",""); //imenovalec mora imeti enako število ničel + 1 Imenovalec = 10 ; Za n = 2 By (StrLength(StrReplace(Unique,Characters.NPP,""))) Imenovalec cikla = Imenovalec * 10 ; EndCycle; male in male črke = število (edinstveno) / imenovalec; //tukaj dobimo delno naključno število od 0 do 1 //pretvori v naključno število iz danega intervala, zaokroži na najbližje celo število NumberOfInterval = Min(Max(Ab(Min + (Max-Min)*Rand),Min),Max); return NumberFromInterval; EndFunction

Druga sistemska možnost:
Rnd = CreateObject("System.Random"); Poročilo(Rnd.Next());

Članka nisem kar začel s tem vzklikom. Zgodilo se je, da ima programer v svojem arzenalu priročno orodje, ki mu omogoča, da v danem intervalu pridobi naključno celo število. Standardne funkcije v drugih programskih jezikih so ustvarile delno število v območju od 0 do 1. To ni zelo priročno število za uporabo; morate se še posebej potruditi, da dobite naključno zaporedje v danem območju, na primer iz 1 do 5.

Priročno orodje je treba preveriti, pogosto RNG-ji niso zelo kakovostni in morate dodatno vaditi matematiko, da povečate naključnost ustvarjenih števil, da se znebite slabo mešanih psevdozaporedij. Naključnim številom pogosto zaupamo skrivnosti, finančne vire, zabavo, modeliranje, testiranje kritičnih avtomatiziranih nadzornih sistemov, programe testiranja, zato je zelo pomembno, da imamo edinstveno zaporedje serije z različnimi specificiranimi značilnostmi od intervalov vrednosti do stopnje mešanja zaporednih številk.

Naj vam navedem primer neuspešnega generiranja naključnih števil. Leta 1993, ko je nebarvni VGA monitor z ločljivostjo 640x480 veljal za dobrega in so bile oči programerjev manj utrujene od njega, je bil Paradox DBMS zelo razširjen. Pohlepni ljudje iz Borland International so se odločili zaslužiti več denarja in za dostop do omrežja zahtevali 10-mestni ključ. Več ključev kot vnesete, več uporabnikov se lahko hkrati poveže z bazo podatkov.

Zdaj se bom pa začela hvaliti s svojimi uspehi :). Na različne načine so do mene prišli 3 ključi in se mi je posvetilo, da je zaporedje psevdonaključno in slabo mešano. Brez tehnologije, zapletenih izračunov in celo brez kalkulatorja mi je uspelo pobrati poljubno število teh ključev. Seveda podjetje Borland ni utrpelo velikih izgub, a ker se že ukvarjate z zaščito, potem to storite dobro ali pa ne izgubljajte časa za nekoristno delo. Iz tega ne bom vlekel morale, upam, da postane bolj jasno, da je RNG pomembna zadeva.

V obrambo psevdonaključnih zaporedij bom rekel, da so včasih nujni, na primer, ko je varnostni ključ izračunan s formulo in se program odloči za uspešno preverjanje ključa v lokalnem načinu. Leta 1993 internet ni bil zelo razširjen in programerji so morali pripraviti zaporedne algoritme, ne da bi jih testirali na strežnikih tretjih oseb. Vendar pazite, da dobro premešate. S sodobnim razvojem omrežij je postalo možno preverjanje serijske številke tako programov kot opreme s pomočjo verifikacijskih strežnikov. Ta sistem je znatno povečal odpornost proti ponarejanju, vendar ni skrivnost, da kljub temu še vedno prihaja do nepooblaščene uporabe programske opreme.

Zaključek je naslednji: ključavnice in zapore nameščajo pošteni ljudje.

Delovanje objekta v platformi 1C je izredno preprosto, čeprav obstajajo nekatere posebnosti.

RNG = NewRandomNumberGenerator(Inicialization); //Tukaj lahko spremenite delovanje generatorja naključnih števil, spreminjanje Inicializacije števila daje različne rezultate. Vrni RNG.RandomNumber(1, SettingsOption);

Če ne podate inicializacije, se zaporedja generirajo naključno in se sama inicializirajo. Podana inicializacijska številka bo vrnila predvidljivo zaporedje, ki je včasih potrebno in uporabno. In če vsakič določite drugo številko, dobite zelo dobro mešanje zaporedja številk.

Da bi preučil delovanje generatorja naključnih števil v 1C, sem ustvaril nekaj obdelav in naredil eno bolj zanimivo v obliki igre, a igra kasneje, najprej posel.

Ustvarjenih je bilo 500 naključnih števil v razponu od 0 do 10000, pri čemer je bil generator stalno inicializiran s funkcijo CurrentUniversalDateInMilliseconds(). Diagram prikazuje dobro porazdelitev vrednosti. Fancy vzorec. Na osi Y je vrednost števila, na osi X je številka ponovitve.

Pozicije točk so precej redke, skoraj se ne držijo ena druge, kar je zelo dobro, kar pomeni, da so generirane številke zelo raznolike.

Umetno ustvarimo slabo različico diagrama:

Pri dobri generaciji temu ne bi smelo biti tako.

Nastavitve generatorja naključnih števil so zelo pomembna točka. Malo jih je, a vse je odvisno od njih.

S to nastavitvijo se oblikuje zaporedje 500 števil v območju od 0 do 10000 in generator se stalno inicializira z novim številom.

Poglejmo ustvarjeno tabelo vrednosti, ki smo jo predhodno razvrstili po vrednostih, da vidimo, ali se ponavljajo številke, ki jih izda generator.

Hiter vizualni pregled razvrščenega seznama je pokazal, da obstajajo ponovitve, čeprav je bila verjetnost, da se pojavijo, majhna. Za generiranje je bil določen širok razpon števil, vendar so se v korakih 10 in 30 števila ponovila.

Sklepamo: objekt Generator naključnih števil lahko ustvari ponavljajoča se števila.

To je včasih nesprejemljivo. Na primer, nedosledno ustvarimo naključno številko dokumenta, da obvestimo uporabnika, kdo lahko odpre določen dokument. V tem primeru so ponavljanja nesprejemljiva, sicer bo ob ponavljanju nejasno, kateri dokument odpreti.

Zakaj je potrebno naključno oštevilčenje? Recimo, da našim partnerjem izdamo številke dokumentov za opremo, predano v popravilo. Lahko izdate neprekinjene zaporedne številke oštevilčenja, vendar lahko stranka, ki ima eno številko, pogleda vsaj sosednje in ob poznavanju intervala oštevilčenja lahko pregleda vse dokumente. V navedenem primeru to ni taka skrivnost, včasih pa je treba zamolčati podatke iz drugih dokumentov.

Z velikimi intervali vrednosti števil generacij se bo verjetnost ponavljanja dogodkov zmanjšala, če pa se dogodek lahko zgodi, potem se bo zagotovo zgodil.

Rešitev bi lahko bila preverjanje edinstvenosti ustvarjene številke, vendar bo to za zelo dolga zaporedja vzelo veliko časa. Razmisliti bomo morali o bolj zapletenem mešanju, a je zaradi tega naloga bolj zanimiva ;).

Pri prikazu vrednosti v grafikonu se obdelava začne opazno upočasnjevati, v mojem računalniku po dodajanju 1000 vrednosti, zato je v nastavitvah potrditveno polje »Ne ustvari grafikona«. Ob namestitvi se hitrost delovanja bistveno poveča pri generiranju dolgih zaporedij, zato bodite pri raziskovanju previdni pri nastavitvi števila generiranih števil.

Generatorju je mogoče dati določeno inicializacijsko vrednost, potem bo rezultat enak, ne glede na to, kolikokrat pritisnete Generation. Ko je polje za obdelavo "RNG inicializacijska številka" nastavljeno na 0, pride do psevdo-naključne inicializacije pri generiranju zaporedja števil.

Hitrost generatorja je dobra, na primer 100.000 številk je bilo ustvarjenih v manj kot 0,5 sekunde.

Prikazal bom primer uporabe RNG na majhnem območju števil na primeru igre Kamen, papir, škarje.

Pravila so preprosta: dva igralca s kretnjami pokažeta označene predmete. Zmaga tisti, ki ima trenutno močnejšo postavo.

Rock premaga Škarje.

Škarje premagajo papir.

Papir premaga kamen.

Pri tej možnosti je vse enakovredno in možnosti za dobitek enake.

Po odigranih 99 igrah sem naredil enako število klikov na vsako figuro, 33-krat, kar je razvidno iz diagrama spodaj desno. Računalnik je zmagal pogosteje kot jaz, kar je bilo nekoliko razočaranje. Računalnik je pogosteje uporabljal papir, kar je razvidno iz spodnjega levega grafikona. Graf na sredini kaže, da nisem bil zmagovalec. Rdeči graf dobitkov računalnika je višji od zelenega (moji dobitki).

Preizkusite svojo srečo! Kljub enaki verjetnosti, da kosi izpadejo, je rezultat vedno drugačen.

Statistika igre je prikazana na sredini, na vrhu v roza skupini elementov.

Z enkratnim klikom na gumb z miško lahko nato s številkami na tipkovnici (ne dodatno) izberete želeno številko. S pritiskom na tipke lahko nekoliko hitreje vnesete podatke, še posebej, če morate igrati brezglave igrice za zbiranje statistike.

Zakomplicirajmo igro. Klasičnim figuram dodajmo še vodnjak.

Rock premaga Škarje.

Škarje premagajo papir.

Papir premaga Rock and Well.

No premaga Rock and Scissors.

V tej varianti se pojavi neenaka vrednost kosov in teoretično je več možnosti za zmago, če izberete Papir in No, saj imata v svojem arzenalu zmago nad dvema sovrstnikoma. Preverimo v praksi:

Kliknil sem le na močne figure in zmagal. Teorijo je potrdila praksa.

Tudi klikanje samo na šibke kose je dalo rezultate, izgubil sem.

Še bolj zapletena različica igre je uvod v peti del, Ogenj.

Kamen premaga Škarje in Vodnjak izgubi proti Papirju in Ognju.

Škarje premagajo Papir in Ogenj izgubi proti Rock and Well.

Papir premaga Rock in Well izgubi proti Fire and Scissors.

Well premaga Fire and Scissors izgubi proti Rock and Paper.

Ogenj premaga papir, kamen pa izgubi proti škarjam in vodnjaku.

V tej različici so figure enake, vendar dve figuri zmagata in izgubita, to doda nekaj spletk in zmanjša verjetnost remija.

Moji kliki so bili kaotični in računalnik me je spet premagal. Med igro lahko vidite, katero figuro računalnik pogosteje uporablja; na podlagi teh informacij lahko poskusite igrati ne kaotično, ampak premišljeno in morda povečati svoje možnosti za uspeh.

Nastavitev generatorja naključnih števil ima svoje značilnosti. Ko je zastavica »Ne uporabljaj odziva uporabnika« počiščena, se pri inicializaciji RNG uporabi številka tipke, ki jo pritisne igralec, kar ustvarjanju doda naključnost. Človek je odličen generator naključnih števil, a vseeno imajo možgani tudi psevdozaporedja. Če človeka prisilite, da izvede 100 pritiskov na tipko, potem lahko ta postopek izvedete vestno, s pritiskom na čim več različnih tipk, lahko pa tudi malomarno, s pritiskom na samo en gumb. Ko je ta zastavica nastavljena, deluje samo računalniško mešanje.

Pri prejemu naključnega zaporedja od osebe, na primer za ustvarjanje ključa za elektronski podpis, je priporočljivo upoštevati ne le pritisnjeno tipko, temveč tudi interval med pritiski. To je zelo naključna informacija, čeprav lahko dober glasbenik večkrat ustvari isto zaporedje.

Zastavica »Ne uporabljaj inicializacije RNG« vklopi/izklopi način inicializacije. Če pri ustvarjanju objekta Generatorja naključnih števil ne določite inicializacije, se ustvari mešano zaporedje.Kolikor razumem, je vključena nekakšna inicializacija, kar se mi je zdelo precej učinkovito.

RNG = NewRandomNumberGenerator();

Tudi med obdelavo lahko nastavite svojo lastno inicializacijsko številko, nato pa se predvidljivo ustvari ista številka.

Pri pisanju postopka za izračun dobitkov sem naletel na problem opisa rezultata, še posebej pri igri s petimi številkami. Ko sem ugotovil, sem ugotovil, da bo veliko črk, saj obstaja veliko možnosti s toliko oblikami. Kombinatorika nam pove, da imamo pri treh številkah največ 9 možnosti, pri štirih 16 možnosti, pri petih pa 25 možnosti. Če izločimo žrebanja, to je takrat, ko se izbere ista figura, sem ugotovil, da bom moral napisati 19 variant pogojev.

Razmišljal sem o tem, saj bi to očitno povzročilo slabo berljivo kodo, in našel sem, kar mislim, da je čudovita rešitev. S skupno 9 pogoji.

Res = Player - Comp; If SettingsOption = 3 Then If (Res = -1) OR (Res = 2) Then Return 1; //Zmagaj v nasprotnem primeru Vrnitev 2; //Premagaj EndIf; ElseIfSettingsOption = 4 Then If (Res = -1) OR (Res = 2) OR (Res = 3) Then Return 1; //Zmagaj v nasprotnem primeru Vrnitev 2; //Premagaj EndIf; ElseIf Nastavitve Možnost = 5 Then If (Res = -1) OR (Res = 2) OR (Res = -3) OR (Res = 4) Then Return 1; //Zmagaj v nasprotnem primeru Vrnitev 2; //Premagaj EndIf; endIf;

Kompakten, jasen, enostaven za urejanje.

Ugotovil sem, da ima vsaka figura svojo številko: 1 - kamen, 2 - škarje, 3 - papir, 4 - vodnjak, 5 - ogenj. Kot rezultat igre izračunam razliko med številom figur in ta razlika mi da jasen odgovor na vprašanje, kdo je zmagal.

Obdelava, ki pomaga raziskovati lastnosti naključnih zaporedij za upravljano aplikacijo in je napisana brez sklicevanja na konfiguracijo. Preizkušeno na platformi 8.3.10, 8.3.11 na tankem odjemalcu.

S tem člankom sem upal pokazati pomembnost in resnost generiranja naključnih številskih zaporedij.

Ključne besede: generator, naključno, števila, število, algoritem, naključno, naključno, porazdelitev, enotna, loterija

Nisem mislil, da bi bilo uporabno v 1C, toda za vas ... stranke so se odločile za promocijo, kot je "zberi kapice", samo ti moraš zbrati besede, kdor zbere pravo besedo iz svojega nabora črk zmaga. Na splošno se zdi naloga preprosta: obstaja abeceda, obstaja določena beseda, ki jo je treba zbrati, na primer "konjak", ima 6 črk, kot lahko vidite.

Morate: ustvariti določeno število naključnih kombinacij šestih črk iz poljubnih črk abecede, temu dodati določeno število možnosti, v katerih je še vedno mogoče dodati besedo, na primer "nkkoya" - beseda je oblikovana, vendar "kavry" očitno ni primeren.

Dodaten pogoj: vse te možnosti (pravilne in ne) morajo biti oštevilčene, da lahko ob prejemu "nagradne" kartice preverite številko (ali je bila).

Zdi se, kaj ima 1C s tem? Tako želijo v računovodski program dodati obračunavanje teh kart in nagrad, hkrati pa so zahtevali generiranje naključnih kombinacij (no, ne pa ročno sestavljanje).
Za vsako promocijo se enkrat generirajo kombinacije, nato pa se na podlagi njih izdelajo karte, t.j. naslednjič bo beseda drugačna itd.

Na splošno se naloga skrči na naslednje:
1. Ustvarite naključna števila, po možnosti z velikim razmikom.
2. S pomočjo številke izračunajte kombinacijo črk (tj. poiščite ujemanje med možnimi kombinacijami in njihovimi številkami).
3. Nasprotna točka od prejšnje - preverite številko kombinacije z besedo.

rešitev:
1. ker generator iz avb in NS je dal majhen razpon naključnih števil, sem moral uporabiti nekoliko drugačen algoritem:

Funkcija Random()
če je emptyvalue(randSeed) = 1 potem
randSeed = _getperformancecounter();
endif;

RandSeed=(a*randSeed+c)%m;
vrni randSeed;
končna funkcija

Tukaj:
a=1664525; c=1013904223; m=4294967296;
zadnja spremenljivka je 2 na 32. potenco, druga dva sta koeficienta, priporočena za te namene

Največja meja vrednosti 2^32 je bila izbrana na podlagi največjega števila kombinacij (za okrnjeno abecedo z 28 črkami in 7 besedami, ker jih je v resničnem problemu točno 7, bo skupno število kombinacij 28 ^7, torej je izbrana meja približno na sredini intervala, kar je povsem dovolj za vzorec 20-30 tisoč možnosti)

Potrebujemo še eno pomožno funkcijo - dvig na pozitivno celo potenco:

Stopnja funkcije (vrednost a, vrednost b, Res=1)
Če b>0 Potem
Res=Res*a;
b=b-1;
Stopnja (a,b,Res);
Vrni Res;
V nasprotnem primeru
Vrni Res;
endIf;
EndFunction

Tukaj: a - osnova stopnje, b - eksponent, Res - rezultat

2. Prepoznavanje razmerja med zaporednimi kombinacijami se je izkazalo za presenetljivo preprosto:

Ko sem razporedil številne elemente po vrstnem redu, sem razkril podobnost razporeditve simbolov s številskim sistemom, le ne decimalnim, ampak v tem primeru "šestnajstiškim" (po številu znakov v nastali "besedi").
Tako je bilo za izračun kombinacije po njenem številu potrebno njeno število pretvoriti v ta sistem številk.

Za naš številski sistem bo osnova potenca šestice, tj. da bi dobili prvo števko na levi, morate število naše kombinacije deliti s 6 na 5. potenco, nato preostanek deljenja s 6 na 4. potenco itd.

Tako dobimo niz šestih številk, ki so v bistvu zaporedne številke črk naše abecede.

Nastala koda:

Funkcija GetCharacters(Pos,TexCharacter=1,SymStr="")
If TekSymv Divisor=Degree(StrLength(Letter),k-TekSymv);
TechOst=Pos%Divider;
SimStr=String(SimStr)+Av(Letters,Integer(Pos/Divisor+?(TekOst>0,1,0)),1);
GetSymbols(TekOst,TekSymv+1,SymStr);
vrni SimStr;
V nasprotnem primeru
SimStr=SimStr+Average(Letters,(?(Pos=0,StrLength(Letters),Pos)),1);
vrni SimStr;
endIf;
EndFunction

Tukaj:
Pos - število kombinacije (psevdonaključno število)
TechSym - trenutni simbol v obdelavi
SimStr - nastali niz znakov
Črke = niz, ki vsebuje črke abecede v standardnem vrstnem redu ("abv...yuya")
k - število znakov v iskani besedi (v tem primeru = 6)

3. Tudi obratna transformacija je trivialna:

Funkcija GetCombination(Word,TexCharacter=0,Pos=0)
NomSymv=Najdi(Črke,Am(Beseda,k-TekSymv,1));
Če je TechCym>0, potem
Če je TechCym Pos=Pos+(NomCym-1)*Degree(StrLength(Letters),TechCym);
V nasprotnem primeru
Povratni položaj;
endIf;
V nasprotnem primeru
Pos=?(NomCym=StrLength(Letters),0,NomSymv);
GetCombination(Word, TechCharacter+1, Pos);
Povratni položaj;
endIf;
EndFunction

Tukaj:
Beseda je kombinacija znakov, katerih število iščemo
TekSymv - trenutni simbol, ki se obdeluje (v bistvu števka šestnajstiškega "števila")
Pos - številka želene kombinacije


************************

Zmešajte N številk:

Za a=1 do N cikel
niz[a]=a;
Konec cikla;
Za a=1 do N-1 cikel
Sl=Case(a,N);// Naključno celo število v intervalu [a..N]
K=matrika[a];
matrika[a]=matrika[Sl];
niz[Sl]=K;
EndCycle;

//********************************************************************************
************************

Sc = CreateObject("MSScriptControl.ScriptControl");
Sc.language = "VBscript";
sc.executeStatement("randomize");
tukaj bo = Sc.eval("rnd");

Kako lahko naredim, da so številke naključno izbrane od 1 do 100?

Rand=_GetPerformanceCounter()%(100+1);

zgleda, da je ta najboljši

//********************************************************************************
************************

V 8.0 lahko uporabite vgrajeni generator GUID za ustvarjanje naključnih števil.
Tu je primer preproste funkcije:

//samo za cela števila
Funkcija GetRandomNumber(Min,Max)

//namesto Randomize
Za n = 1 do 100 ciklov
Unique = Nov UniqueIdentifier;
EndCycle;

//ustvari GUID
Unique = AbbrLP(Nov UniqueIdentifier);

//ohrani samo številke
Unique = StrReplace(Unique,"-","");
Unique = StrReplace(Unique,"a","");
Unique = StrReplace(Unique,"b","");
Unique = StrReplace(Unique,"c","");
Unique = StrReplace(Unique,"d","");
Unique = StrReplace(Unique,"e","");
Unique = StrReplace(Unique,"f","");

//imenovalec mora imeti enako število ničel + 1
imenovalec = 10;
Za n = 2 Po (StrLength(StrReplace(Unique,Characters.NPP,""))) Loop
Imenovalec = imenovalec * 10;
EndCycle;

male in male črke = število (edinstveno) / imenovalec; //tukaj dobimo delno naključno število od 0 do 1

//pretvori v naključno število iz danega intervala, zaokroži na najbližje celo število
NumberOfInterval = Min(Max(Ab(Min + (Max-Min)*Rand),Min),Max);

return NumberFromInterval;

EndFunction

Povzeto iz [za ogled povezave se morate registrirati]

//********************************************************************************
************************

PS. Med iskanjem generatorja naključnih števil sem naletel na ta članek. Tako sem zase izbral možnost
Rand=_GetPerformanceCounter()%(100+1);



Vam je bil članek všeč? Deli s prijatelji: