2011-11-08 41 views
2

我想生成一個31到60之間的隨機數。在目標c中生成唯一的隨機數?

所以我用rand(),但我認爲它會給一些時間相同的值。但是我需要每次都給它新的價值。

我怎樣才能做到這一點?

+2

有31和60之間的有限範圍內,所以它一定會重複在某些點(考慮到你想要的整數) – sidyll

回答

1

重複值與隨機值一致。如果你不能重複值,你可以用可能的值創建一個數組,然後從這個數組中隨機地移除一個數字,直到它爲空,但是這個數字比真正的隨機數少。

+0

...或只是洗牌陣列。 – NullUserException

+0

@NullUserExceptionఠ_ఠ這將允許在刪除所有值之前重複執行結果。 – petervaz

1

希望,這將是有幫助的:

int r = arc4random()%30+30; 
8

使用arc4random(),它將提供一個良好的隨機數,並且不需要播種。

rand()每次應用程序運行時都會產生相同的序列,除非您使用唯一值對其進行種子處理。

然後它是一個問題或縮小範圍。一個簡單的解決方案是修改範圍並添加範圍的低端。 (這將導致一個小的偏差,應該是可以接受的。)

例子:

int rangeLow = 31; 
int rangeHigh = 60; 
int randomNumber = arc4random() % (rangeHigh-rangeLow+1) + rangeLow; 

如果你想@ pawan.mangal有一個鏈接到一個很好的發生範圍內的每個號碼只有一次,然後什麼解。

+0

它就像一個魅力。 – Gypsa

4

代替蘭特(),您可以使用arc4random()

要想從arc4random一個整數值(),從0到X-1,你可以這樣做:

int value = arc4random() % x; 

要在x的取值範圍爲1得到一個整數,只需添加1:

int value = (arc4random() % x) + 1; 

最後,如果你需要生成一個浮點數,在你的項目中定義的:

#define ARC4RANDOM_MAX  0x100000000' 

然後,您可以使用arc4random()來得到一個浮點值(在使用RAND()的雙精度),0和100之間,就像這樣:

double val = floorf(((double)arc4random()/ARC4RANDOM_MAX) * 100.0f); 
0

以爲我可以添加我在許多項目中使用的方法。

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

如果我結束了在許多文件中使用它,我通常聲明一個宏作爲

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

例如

NSInteger myInteger = RAND_FROM_TO(31,60) // 31, 32,..., 59, 60 
2

的follwing方法會產生獨特的隨機數的範圍低,你在你的問題中提到high.as一個數組,你需要31之間的隨機數到60,所以會出現在最大29個唯一編號陣列。

-(void)generateRandomUniqueNumberInRange :(int)rangeLow :(int)rangeHigh{ 
     NSMutableArray *unqArray=[[NSMutableArray alloc] init]; 
     int randNum = arc4random() % (rangeHigh-rangeLow+1) + rangeLow; 
     int counter=0; 
     while (counter<rangeHigh-rangeLow) { 
      if (![unqArray containsObject:[NSNumber numberWithInt:randNum]]) { 
       [unqArray addObject:[NSNumber numberWithInt:randNum]]; 
       counter++; 
      }else{ 
       randNum = arc4random() % (rangeHigh-rangeLow+1) + rangeLow; 
      } 

     } 
     NSLog(@"UNIQUE ARRAY %@",unqArray); 

    }