Nesne C'deki bir diziyi rasgele hale getirmenin kanonik bir yolu var mı?Nesne C'deki bir NSArray'ı rasgele birleştirme yolu kuralı
cevap
Benim araç kütüphanesi bunu yapmak için NSMutableArray bu kategoriyi tanımlar:
@interface NSMutableArray (ArchUtils_Shuffle)
- (void)shuffle;
@end
// Chooses a random integer below n without bias.
// Computes m, a power of two slightly above n, and takes random() modulo m,
// then throws away the random number if it's between n and m.
// (More naive techniques, like taking random() modulo n, introduce a bias
// towards smaller numbers in the range.)
static NSUInteger random_below(NSUInteger n) {
NSUInteger m = 1;
// Compute smallest power of two greater than n.
// There's probably a faster solution than this loop, but bit-twiddling
// isn't my specialty.
do {
m <<= 1;
} while(m < n);
NSUInteger ret;
do {
ret = random() % m;
} while(ret >= n);
return ret;
}
@implementation NSMutableArray (ArchUtils_Shuffle)
- (void)shuffle {
// http://en.wikipedia.org/wiki/Knuth_shuffle
for(NSUInteger i = [self count]; i > 1; i--) {
NSUInteger j = random_below(i);
[self exchangeObjectAtIndex:i-1 withObjectAtIndex:j];
}
}
@end
Eğer diyoruz bazen önce (ör srandom(time(NULL))
ile) rasgele sayı üreticisinin emin olun; aksi halde çıktı çok rasgele olmaz.
Love it! Paylaşım için teşekkürler. Artık yardımcı program kütüphanenizin geri kalanını çok merak ediyorum. – PEZ
Çoğu algoritmik değil - + [NSArray arrayWithCount: sayılar:] ("sayılar" iki katına çıkar)) - [UIView moveToSuperview: withFrame: animated:], artı tek nesne Çekirdek Veri yığını . –
Bu benim için çalışmıyor. Demek istediğim "biraz" karıştırıyor ama bazı bölümler hâlâ sıralanıyor. Aynı dizi verildiğinde, ilk karıştırmanın her zaman aynı sonucu vardır. Bu nedenle gerçekten rastgele değil. –
Sormak istediğiniz şey SDK'ya yerleşik değil.
Ancak istediğiniz herhangi bir rasgele seçim veya karıştırma algoritmasını kullanabilirsiniz. Farklı algoritmalar
http://en.wikipedia.org/wiki/Shuffling#Shuffling_algorithms
"yerinde" karıştır algoritmalar için yeniden algoritmalar için
insertObject:atIndex:
removeObjectAtIndex:
kullandığınız bir değişken dizisi ile başlar, vb rasgelelik, verimlilik açısından farklı eksikleri var dizi, orijinali besleyin ve yeni bir dizi oluşturun.
if ([array count] > 1) {
for (NSUInteger shuffleIndex = [array count] - 1; shuffleIndex > 0; shuffleIndex--)
[array exchangeObjectAtIndex:shuffleIndex withObjectAtIndex:random() % (shuffleIndex + 1)];
}
Random() işlevini srandomdev() veya srandom() ile eklediğinizden emin olun.
Yazdıklarınız örnek yöntem olarak anlam ifade etmiyor. Kod mevcut olduğundan, yalnızca bir işlev veya sınıf yöntemi olmalıdır. Idiomatically, kendisini karıştırır yeni, karıştırılmış dizi veya bir NSMutableArray örnek yöntemi döndüren bir NSArray örnek yöntemi olmalıdır. – Chuck
Doğru, sadece buradaki kodu göstermekteydim, bir kategoriye koyma konusunda endişelenmemiştim. Ayrıca srandomdev() veya srandom() ile random() işlevini tohumlamaktan bahsetmeyi unuttum. –
Bu kod, modulo nedeniyle biraz önyargılıdır; Bu konuda daha fazla bilgi için http://en.wikipedia.org/wiki/Fisher-Yates_shuffle#Modulo_bias sayfasına bakın. –
kurallı NSArray
bir kategori yapmadan bir şekilde (yani arrayWithRandomizedIndices
gibi bir örnek yöntemi sahip) ya da NSMutableArray
(yani randomizeIndices
gibi bir yöntem varsa) mevcut değildir.
Kitaplığımdan, NSMutableArray
numaralı telefondan bir bölümün bir örneği. Birkaç girişi karıştırmak yerine diziyi rasgele yeniden sıralar.
- (void) randomizeIndices
{
if (self == nil || [self count] <= 1)
{
return;
}
int count = [self count];
NSMutableArray* copySelf = [NSMutableArray arrayWithArray:self];
NSMutableArray* mutableResultArray = [NSMutableArray alloc];
mutableResultArray = [mutableResultArray initWithCapacity:count];
[mutableResultArray autorelease];
int objectsMovedCount = 0;
for (int i = 0; i < count; i++)
{
int index = rand() % (count - objectsMovedCount);
id anObject = [copySelf objectAtIndex:index];
[mutableResultArray addObject:anObject];
[copySelf removeObjectAtIndex:index];
objectsMovedCount++;
}
[self setArray:mutableResultArray];
}
Çağrı srand(time(0));
veya erken yönteminde bu yöntemi veya çağırmadan önce bazı tür.
Çözümüm, dizinin bir kopyasını rastgele (arc4random kullanarak) öğelerle döndüren bir kategori yöntemidir.
@interface NSArray (CMRandomised)
/* Returns a copy of the array with elements re-ordered randomly */
- (NSArray *)randomised;
@end
/* Returns a random integer number between low and high inclusive */
static inline int randomInt(int low, int high)
{
return (arc4random() % (high-low+1)) + low;
}
@implementation NSArray (CMRandomised)
- (NSArray *)randomised
{
NSMutableArray *randomised = [NSMutableArray arrayWithCapacity:[self count]];
for (id object in self) {
NSUInteger index = randomInt(0, [randomised count]);
[randomised insertObject:object atIndex:index];
}
return randomised;
}
@end
İşte işte burada!
- (NSArray*)shuffleArray:(NSArray*)array {
NSMutableArray *temp = [[NSMutableArray alloc] initWithArray:array];
for(NSUInteger i = [array count]; i > 1; i--) {
NSUInteger j = arc4random_uniform(i);
[temp exchangeObjectAtIndex:i-1 withObjectAtIndex:j];
}
return [NSArray arrayWithArray:temp];
}
NSArray randomizasyon: As
@implementation NSArray (NGDataDynamics)
- (NSArray *)jumbled
{
NSMutableArray *jumbled = self.mutableCopy;
NSUInteger idx = self.count-1;
while(idx)
{
[jumbled exchangeObjectAtIndex:idx
withObjectAtIndex:arc4random_uniform(idx)];
idx--;
}
return jumbled;
}
@end
görülme: NSArray Randomization & Psychedelia
ait- 1. Veritabanından rasgele nesne GORM ile
- 2. Array öğesinden rasgele nesne alın
- 3. Python'da rasgele kesinliğe yuvarlanmanın verimli yolu
- 4. asp dizin yolu ile rasgele bir dosya seçin.
- 5. İletişim kuralı
- 6. Bir entegrasyon kuralı nasıl uygulanır?
- 7. Koşullu biçimlendirme kuralı ekle
- 8. Genel nesne için nesne türünü kontrol etmenin uygun yolu nedir?
- 9. htaccess kuralı sayfaya gidip
- 10. Çağıran kuralı, C++
- 11. Yazdığınız bir nesneyi rasgele anahtarlarla nasıl bildirilir?
- 12. Bir liste basan bir işlevi, trapez kuralı
- 13. Rasgele hızlı Rasgele hızlı uygulanması için
- 14. C# dizilerinde birleştirme/birleştirme #
- 15. C# Birleştirme Üst düzeyden alt nesnelerin listesi Nesne Listesi
- 16. WSO2 İş Kuralı Sunucusu
- 17. Rasgele bir yola CALayer kırpma
- 18. TensorFlow: rasgele bir sabit oluşturma
- 19. Eclipse rasgele bir şekilde başlatıldı
- 20. ZSH_THEME = "rasgele"
- 21. rasgele JQuery
- 22. Rastgele int 'rasgele' aktarmadan
- 23. Nesne örneklerinin bilinmeyen sayıda oluşturulmasının etkili yolu
- 24. Dizgeyi Nesne dönüştürmek için genel yolu
- 25. java interscect, birleştirme, birleştirme, farklı listelenmiş listeler
- 26. Şaşırtıcı bir dizgi birleştirme
- 27. JPA ile İletişim Kuralı Tamponları
- 28. scikit-learn kullanarak rasgele ormanların paralel üretimi
- 29. ifs olmadan rasgele değer?
- 30. .htaccess! -f kuralı çalışmıyor
olası yinelenen [Ne bir NSMutableArray karıştır'ın en iyi yol değil mi?] (Http: // stackoverflow .com/questions/56648/whats-the-best-way-to-shuffle-an-nsmutablearray) – Senseful
Öneri [Fisher-Yates] (https://en.wikipedia.org/wiki/Fisher%E2%80% NSMutableArray için: 93Yates_shuffle: için (NSUInteger i = self.count; i> 1; i--) [self exchangeObjectAtIndex: i - 1 ile ObjectAtIndex: arc4random_uniform ((u_int32_t) i)]; ' –