Objective-C-də Random sayı tərtibatı

Əsasən mən Java meneceri oldum və 0 ilə 74 arasında bir söz-təsadüfi ədədi yaratmaq üçün bir yola ehtiyac duyuram. Java'da məni istifadə edərdim:

 Random.nextInt(74) 

Mənə toxum və ya əsl təsadüf müzakirə maraqlı deyiləm, yalnız Objective-C eyni vəzifəni yerinə necə. Mən Google saydıq və bir çox müxtəlif və ziddiyyətli bit məlumatları var.

724
02 окт. rustyshelf 02 oct tərəfindən təyin . 2008-10-02 07:35 '08 at 07:35 2008-10-02 07:35
@ 13 cavab

arc4random_uniform() istifadə arc4random_uniform() . Mükəmməl bir rand alqoritmi istifadə edir. Hətta toxum əkmək üçün də yoxdur.

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

arc4random səhifə:

 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 окт. Cavab lajos 02 oct tərəfindən verilir . 2008-10-02 19:00 '08 saat 19.00 'da

arc4random_uniform(upper_bound) funksiyasından aralığında təsadüfi bir sıra yaratmaq üçün istifadə edin. Aşağıdakılar 0 ilə 73 arasında olan bir sıra yaradır.

 arc4random_uniform(74) 
border=0

arc4random_uniform(upper_bound) səhifəsində təsvir olunduğu kimi arc4random_uniform(upper_bound) yanaşmaları qarşısını alır:

arc4random_uniform () üst_bounddan daha az eyni şəkildə paylanmış təsadüfi sayını qaytarır. arc4random_uniform (), üst sərhəd ikiyə bərabər olmadığı zaman, "arc4random ()% upper_bound" kimi konstruksiyalar üçün tövsiyə olunur.

415
16 авг. Cavab 16 iyulda verilir . 2011-08-16 20:47 '11 saat 20:47 'də 2011-08-16 20:47

C ilə eyni, bunu edərdin

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

(ehtimal etdiyiniz kimi, 0 kodunu nəzərdə tutursunuz, ancaq 74 nümunəsi istisna olmaqla)

Düzenleme: random() və ya arc4random() rand() ilə əvəz etmək mümkün deyil (başqaları qeyd arc4random() kimi, olduqca emal olunur).

61
02 окт. cavab Mike F 02 oct tərəfindən verilir . 2008-10-02 07:45 '08 at 07:45 2008-10-02 07:45

Mən bir çox layihələrdə istifadə etdiyim bir üsul əlavə edə bilərəm.

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

Mən bunu bir çox faylda istifadə edirəmsə, adətən makroyu elan edirəm

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

məsələn.

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

Qeyd: Yalnız iOS 4.3 / OS X v10.7 (Lion) və sonrakı versiyaları üçün.

44
19 июня '13 в 17:08 2013-06-19 17:08 Cavab 19.06.13 saat 17:08 'da Groot tərəfindən verilir. 2013-06-19 17:08

Bu, 0 ilə 47 arasında dəyişən nöqtə verəcəkdir

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

Və ya yalnız

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

Həm aşağı, həm də üst sərhəd mənfi ola bilər. Aşağıdakı nümunə kodu -35.76 və +12.09 arasında təsadüfi bir sıra verir

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

Nəticəni dəyirmi Integer dəyərinə çevirmək:

 int intRndValue = (int)(rndValue + 0.5); 
42
16 февр. Cavab 16 fevralda Tibidabo tərəfindən verilir. 2012-02-16 14:47 '12 at 2:47 pm 2012-02-16 14:47

Rand (3) əl səhifəsinə görə, funksiyaların rand ailəsi təsadüfi deyil (3). Bu, aşağı 12 bit rand () nin bir siklik nümunədən keçməsi ilə bağlıdır. Təsadüfi bir nömrə əldə etmək üçün sadəcə srandom () işarəsi olmayan bir toxum ilə çağıraraq generatoru başlayın və sonra təsadüfi () çağırın. Beləliklə, yuxarıda ekvivalent kod olardı

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

Seed dəyişdirmək istəmirsinizsə, yalnız srandom () proqramına bir dəfə zəng etmək lazımdır. Rand () olduqca pis təsadüfi saylı bir generator, təsadüfi () təsadüfi dəyərləri müzakirə etmək istəmədiyini söylədiyinizə baxmayaraq, 0 və RAND_MAX arasında bir sıra meydana gətirəcəyi üçün təsadüfi () hələ də modul yanaşmalara məruz qalır. Beləliklə, məsələn, RAND_MAX 3dirsə və 0dan 2-ə təsadüfi bir sıra istəsəniz, 0 və ya 2-dən çox olma ehtimalı iki dəfə.

35
02 окт. Oct 02- də Michael Buckley tərəfindən verilmiş cavab 2008-10-02 09:49 '08 at 9:49 2008-10-02 09:49

arc4random_uniform istifadə etmək daha yaxşıdır. Bununla belə, iOS 4.3-in altında mövcud deyil. Xoşbəxtlikdən, iOS bu işarəni işləmə müddətində deyil, kompilyasiya müddətində bağlayacaq (belə ki, mövcud olub olmadığını yoxlamaq üçün # preprocessor direktivindən istifadə etməyin).

arc4random_uniform mövcud olub olmadığını müəyyən etmək üçün ən yaxşı yoldur bu kimi bir şey etməkdir:

 #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 cavab 19 iyun 2012 -ci il saat 15: 38-də verilir. 2012-06-19 15:38

Mən öz təsadüfi ədədi yazdım, buna görə də Java-da daha çox Math.random () kimi baxdığınız bir şey olardı. Yalnız iki funksiyası var və hər şey C.

Başlıq faylı:

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

İcra faylları:

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

Bu, yalançı randomların yaradılmasının çox klassik üsuludur. Mənim ərizəçimdə mən dəvət edirəm:

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

Sonra deyirəm:

 float myRandomNumber = nextRandomFloat() * 74; 

Qeyd edək ki, bu metod 0.0f (inclusive) və 1.0f (istisna olmaqla) arasında təsadüfi bir sıra qaytarır.

12
28 янв. cavab Eli 28 yanvar verilir . 2010-01-28 03:02 '10 at 3:02 2010-01-28 03:02

Zaten bir sıra böyük, formüle edilmiş cavablar var, lakin sual 0'dan 74-ə qədər təsadüfi bir sayıdır. İstifadə edin:

arc4random_uniform(75)

6
11 мая '15 в 18:20 2015-05-11 18:20 Cavab Tom Xovard tərəfindən 11 May 'da 18:20' də verilir 2015-05-11 18:20

İOS 9 və OS X 10.11 ilə başlayaraq, müxtəlif yollarla təsadüfi ədədlər yaratmaq üçün yeni GameplayKit dərslərindən istifadə edə bilərsiniz.

Seçdiyiniz dörd növ mənbəyiniz var: ümumi bir təsadüfi mənbə (heç bir adı, hətta bir sistemi nə seçə bilər), doğrusal əlaqə, ARC4 və Mersenne Twister. Onlar təsadüfi ints, floats və bools yarada.

Sadə səviyyədə sistemə daxil olan təsadüfi bir mənbədən təsadüfi bir sıra yarada bilərsiniz:

 NSInteger rand = [[GKRandomSource sharedRandom] nextInt]; 

Bu, 2,147,483,648-dən 2,147,483,647-ə qədər bir nömrə çıxarır. 0-dan üst limitə (ex) bir nömrəyə ehtiyacınız varsa, bunu istifadə etməlisiniz:

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

GameplayKit dices ilə işləmək üçün rahat quruculara malikdir. Məsələn, belə bir altıbucaqlı matrisi gəzə bilərsiniz:

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

Plus, GKShuffledDistribution kimi şeyləri istifadə edərək, təsadüfi bir paylanma meydana GKShuffledDistribution .

3
19 дек. Cavab 19 dekabrda İki Straw tərəfindən verilir . 2015-12-19 16:23 '15 'də saat 16:23 ' da

// Aşağıdakı nümunə 0 ilə 73 arasında bir sıra yaradır.

 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); 

Nəticə:

  • Təsadüfi sayı: 72

  • təsadüfi sayda 2 addım: 52

2
29 сент. cavab Sujania tərəfindən 29 sentyabrda verilir . 2015-09-29 12:51 '15 at 12:51 2015-09-29 12:51

0 ilə 99 arasında təsadüfi bir sıra yaradın:

 int x = arc4random()%100; 

500 ilə 1000 arasında təsadüfi bir sıra yaradın:

 int x = (arc4random()%501) + 500; 
2
24 февр. Cavab verilir adijazz91 24 fevral. 2015-02-24 13:29 '15 'də saat 13:29 ' da

Dev oyun üçün təsadüfi ədədlər yaratmaq üçün təsadüfi () istifadə edin. Yəqin ki, arc4random () istifadə etməkdən ən az 5 dəfə daha sürətli. Modulonun prioriteti, xüsusilə tam təsadüfi () sıra ilə randomlar yaradan zaman oyunlar üçün problem deyil. Əvvəl toxumu əmin olun. AppDelegate-də srandomdev () çağırın. Burada köməkçi funksiyalar:

 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 cavab 15 iyul 'da saat 17: 55- də Robert Vasmann tərəfindən verilir. 2016-07-15 07:55

etiketləri ilə bağlı digər suallar və ya sual verin