Atsitiktinių skaičių generavimas C tikslo

Iš esmės aš esu „Java“ vadybininkas, ir man reikia būdų, kaip generuoti pseudo-atsitiktinį skaičių nuo 0 iki 74. „Java“ naudosiu metodą:

 Random.nextInt(74) 

Aš nesu suinteresuota aptarti sėklos ar tikro sutapimo, kaip jūs atliekate tą patį uždavinį C tikslo. Aš skaičiuojau „Google“, ir atrodo, kad yra daug skirtingų ir prieštaringų informacijos.

724
02 окт. nustatė rustyshelf 02 oct. 2008-10-02 07:35 '08, 07:35, 2008-10-02 07:35
@ 13 atsakymų

Turite naudoti arc4random_uniform() . Jis naudoja puikų rand algoritmą. Net nereikia sodinti sėklų.

 #include <stdlib.h> // ... // ... int r = arc4random_uniform(74); 

arc4random puslapis:

 NAME arc4random, arc4random_stir, arc4random_addrandom -- arc4 random number generator LIBRARY Standard C Library (libc, -lc) SYNOPSIS #include <stdlib.h> u_int32_t arc4random(void); void arc4random_stir(void); void arc4random_addrandom(unsigned char *dat, int datlen); DESCRIPTION The arc4random() function uses the key stream generator employed by the arc4 cipher, which uses 8*8 8 bit S-Boxes. The S-Boxes can be in about (2**1700) states. The arc4random() function returns pseudo- random numbers in the range of 0 to (2**32)-1, and therefore has twice the range of rand(3) and random(3). The arc4random_stir() function reads data from /dev/urandom and uses it to permute the S-Boxes via arc4random_addrandom(). There is no need to call arc4random_stir() before using arc4random(), since arc4random() automatically initializes itself. EXAMPLES The following produces a drop-in replacement for the traditional rand() and random() functions using arc4random(): #define foo4random() (arc4random() % ((unsigned)RAND_MAX + 1)) 
1000
02 окт. atsakymą pateikė lajos 02 okt. 2008-10-02 19:00 '08, 7 val. 2008-10-02 19:00

Naudokite funkciją arc4random_uniform(upper_bound) kad sukurtumėte atsitiktinį skaičių intervale. Toliau bus sukurtas skaičius nuo 0 iki 73 imtinai.

 arc4random_uniform(74) 
border=0

arc4random_uniform(upper_bound) išvengia modulio šališkumo , kaip aprašyta „ arc4random_uniform(upper_bound) puslapyje:

arc4random_uniform () grąžina tolygiai paskirstytą atsitiktinį skaičių, mažesnį nei viršutinis_prieš. „arc4random_uniform“ () rekomenduojama naudoti tokiose konstrukcijose, kaip „` arc4random ()% upper_bound '', nes jis išvengia modulio šališkumo, kai viršutinė riba nėra lygi dviem.

415
16 авг. atsakymas duodamas jums 16 d. 2011-08-16 20:47 '11 prie 20:47 2011-08-16 20:47

Tą patį kaip ir C

 #include <time.h> #include <stdlib.h> ... srand(time(NULL)); int r = rand() % 74; 

(darant prielaidą, kad jūs įtraukėte 0, bet išskyrus 74, ką jūsų „Java“ pavyzdys daro)

Redaguoti: Neįmanoma pakeisti random() arba arc4random() su rand() (kurios, kaip kiti nurodė, yra gana čiulpti).

61
02 окт. atsakymą pateikė Mike F 02 okt. 2008-10-02 07:45 '08, 07:45, 2008-10-02 07:45

Maniau, kad galėčiau pridėti metodą, kurį naudoju daugelyje projektų.

 - (NSInteger)randomValueBetween:(NSInteger)min and:(NSInteger)max { return (NSInteger)(min + arc4random_uniform(max - min + 1)); } 

Jei naudoju jį daugelyje failų, paprastai skelbiu makro kaip

 #define RAND_FROM_TO(min, max) (min + arc4random_uniform(max - min + 1)) 

Pavyzdžiui.

 NSInteger myInteger = RAND_FROM_TO(0, 74) // 0, 1, 2,..., 73, 74 

Pastaba: tik iOS 4.3 / OS X v10.7 (liūtas) ir vėlesnėms versijoms.

44
19 июня '13 в 17:08 2013-06-19 17:08 atsakymą pateikė „ Groot “ birželio 13 d., 17:08 2013-06-19 17:08

Tai suteiks jums slankiojo kablelio numerį nuo 0 iki 47

 float low_bound = 0; float high_bound = 47; float rndValue = (((float)arc4random()/0x100000000)*(high_bound-low_bound)+low_bound); 

Arba tiesiog tiesiog

 float rndValue = (((float)arc4random()/0x100000000)*47); 

Tiek apatinė, tiek viršutinė riba gali būti neigiama . Toliau pateiktame pavyzdiniame kode atsitiktinis skaičius yra tarp -35,76 ir +12,09.

 float low_bound = -35.76; float high_bound = 12.09; float rndValue = (((float)arc4random()/0x100000000)*(high_bound-low_bound)+low_bound); 

Rezultato konvertavimas į apvalią vertę:

 int intRndValue = (int)(rndValue + 0.5); 
42
16 февр. Atsakymą pateikė Tibidabo vasario 16 d. 2012-02-16 14:47 '12 at 2:47 pm 2012-02-16 14:47

Pasak Rando (3) rankinio puslapio, Randas funkcijų šeima buvo pasenusi (3). Taip yra dėl to, kad mažesni 12 bituitų randai () eina per ciklinį modelį. Norėdami gauti atsitiktinį skaičių, tiesiog paleiskite generatorių, skambindami srandom () su nepasirašyta sėkla, ir paskambinkite atsitiktine (). Taigi, lygiavertis kodas būtų

 #import <stdlib.h> #import <time.h> srandom(time(NULL)); random() % 74; 

Jei nenorite pakeisti savo sėklų, savo programoje reikės vieną kartą skambinti srandom (). Nors sakėte, kad nenorite aptarti tikrai atsitiktinių verčių, randas () yra gana blogas atsitiktinių skaičių generatorius, o atsitiktinis () vis dar kenčia nuo modulinio šališkumo, nes jis generuos skaičių nuo 0 iki RAND_MAX. Taigi, pavyzdžiui, jei RAND_MAX yra 3, ir norite atsitiktinio skaičiaus nuo 0 iki 2, jums du kartus didesnė tikimybė gauti 0 nei 1 arba 2.

35
02 окт. Michael Buckley atsakymas 02 spalio mėn 2008-10-02 09:49 '08 at 9:49 2008-10-02 09:49

Tai geriau naudoti arc4random_uniform . Tačiau jis nėra prieinamas po „iOS“ 4.3. Laimei, „iOS“ prijungs šį simbolį vykdymo metu, o ne kompiliavimo metu (todėl nenaudokite „#if“ išankstinio apdorojimo direktyvos, jei norite patikrinti, ar ji yra prieinama).

Geriausias būdas nustatyti, ar arc4random_uniform yra, yra kažkas panašaus:

 #include <stdlib.h> int r = 0; if (arc4random_uniform != NULL) r = arc4random_uniform (74); else r = (arc4random() % 74); 
30
19 июня '12 в 15:38 2012-06-19 15:38 atsakymas pateikiamas AW101 birželio 19, 12 d. 15:38 2012-06-19 15:38

Aš parašiau savo atsitiktinį skaičių virš galvos, todėl norėčiau turėti kažką, kas atrodė labiau kaip Math.random () Java. Ji turi tik dvi funkcijas, ir viskas daroma C.

Antraštės failas:

 //Random.h void initRandomSeed(long firstSeed); float nextRandomFloat(); 

Įgyvendinimo failas:

 //Random.m static unsigned long seed; void initRandomSeed(long firstSeed) { seed = firstSeed; } float nextRandomFloat() { return (((seed= 1664525*seed + 1013904223)>>16) / (float)0x10000); } 

Tai gana klasikinis būdas sukurti pseudo-randoms. Savo paraiškos delegate aš kreipiuosi į:

 #import "Random.h" - (void)applicationDidFinishLaunching:(UIApplication *)application { initRandomSeed( (long) [[NSDate date] timeIntervalSince1970] ); //Do other initialization junk. } 

Tada aš tiesiog sakau:

 float myRandomNumber = nextRandomFloat() * 74; 

Atkreipkite dėmesį, kad šis metodas grąžina atsitiktinį skaičių tarp 0,0f (imtinai) ir 1.0f (išimtis).

12
28 янв. atsakymas pateikiamas Eli 28 jan. 2010-01-28 03:02 '10 at 3:02 2010-01-28 03:02

Jau yra keletas didelių, suformuluotų atsakymų, tačiau klausimas yra atsitiktinis skaičius nuo 0 iki 74. Naudoti:

arc4random_uniform(75)

6
11 мая '15 в 18:20 2015-05-11 18:20 atsakymą pateikė Tomas Howardas gegužės 15 d. 15 val. 2015-05-11 18:20

Pradedant nuo iOS 9 ir OS X 10.11, galite naudoti naujas GameplayKit klases, kad įvairiais būdais generuotumėte atsitiktinius skaičius.

Galite rinktis iš keturių tipų šaltinių: bendrojo atsitiktinio šaltinio (be pavadinimo, net sistemos, pasirinkti, ką jis daro), linijinį kongruenciją, ARC4 ir Mersenne Twister. Jie gali generuoti atsitiktinius ints, plūdes ir boolus.

Paprasčiausiu lygiu galite sukurti atsitiktinį skaičių iš atsitiktinio šaltinio, įterpto į sistemą:

 NSInteger rand = [[GKRandomSource sharedRandom] nextInt]; 

Tai sukuria skaičių nuo -2,147,483,648 iki 2,147,483,647. Jei jums reikia numerio nuo 0 iki viršutinės ribos (ex), turėtumėte tai naudoti:

 NSInteger rand6 = [[GKRandomSource sharedRandom] nextIntWithUpperBound:6]; 

GameplayKit turi įmontuotus patogumo darbus dirbant su kauliukais. Pavyzdžiui, galite sukti šešiakampę matricą tokiu būdu:

 GKRandomDistribution *d6 = [GKRandomDistribution d6]; [d6 nextInt]; 

Be to, galite sukurti atsitiktinį paskirstymą naudodami tokius dalykus kaip GKShuffledDistribution .

3
19 дек. Atsakymą du kartus atsiuntė „TwoStraws “ gruodžio 19 d. 2015-12-19 16:23 '15 16:23 2015-12-19 16:23

// Toliau pateiktas pavyzdys generuos skaičių nuo 0 iki 73.

 int value; value = (arc4random() % 74); NSLog(@"random number: %i ", value); //In order to generate 1 to 73, do the following: int value1; value1 = (arc4random() % 73) + 1; NSLog(@"random number step 2: %i ", value1); 

Išvada:

  • atsitiktinis skaičius: 72

  • atsitiktinis skaičius 2: 52

2
29 сент. atsakymą pateikė 29- asis Sujania . 2015-09-29 12:51 '15 at 12:51 2015-09-29 12:51

Sukurkite atsitiktinį skaičių nuo 0 iki 99:

 int x = arc4random()%100; 

Sukurkite atsitiktinį skaičių nuo 500 iki 1000:

 int x = (arc4random()%501) + 500; 
2
24 февр. atsakymas duotas adijazz91 24 vasaris 2015-02-24 13:29 '15, 13:29, 2015-02-24 13:29

„Dev“ žaidimui naudokite atsitiktinius (), kad sukurtumėte atsitiktinius skaičius. Tikriausiai bent 5 kartus greičiau nei naudojant arc4random (). „Modulo“ prioritetas nėra problema, ypač žaidimams, kuriant „randoms“, naudojant visą atsitiktinį () diapazoną. Įsitikinkite, kad pirmiausia sėklų. Skambinkite srandomdev () programoje „AppDelegate“. Štai keletas pagalbinių funkcijų:

 static inline int random_range(int low, int high){ return (random()%(high-low+1))+low;} static inline CGFloat frandom(){ return (CGFloat)random()/UINT32_C(0x7FFFFFFF);} static inline CGFloat frandom_range(CGFloat low, CGFloat high){ return (high-low)*frandom()+low;} 
0
15 июля '16 в 7:55 2016-07-15 07:55 atsakymą pateikė Robert Wasmann , liepos 15 d. 16, 07:55 2016-07-15 07:55

Kiti klausimai apie etiketes arba Užduoti klausimą