Saya terutama kepala Java, dan saya ingin cara untuk menghasilkan nomor pseudo-acak antara 0 dan 74. Di Jawa saya akan menggunakan metode ini:
Random.nextInt(74)
Saya tidak tertarik dalam diskusi tentang benih atau keacakan benar, hanya bagaimana Anda menyelesaikan tugas yang sama di Objective-C. Saya telah menjelajahi Google, dan sepertinya ada banyak bit informasi yang berbeda dan saling bertentangan.
objective-c
random
rustyshelf
sumber
sumber
arc4random_uniform(x)
seperti dijelaskan di bawah oleh @yood. Ini juga di stdlib.h (setelah OS X 10.7 dan iOS 4.3) dan memberikan distribusi angka acak yang lebih seragam. Penggunaanint r = arc4random_uniform(74);
Gunakan
arc4random_uniform(upper_bound)
fungsi untuk menghasilkan angka acak dalam rentang. Berikut ini akan menghasilkan angka antara 0 dan 73 inklusif.arc4random_uniform(upper_bound)
menghindari modulo bias seperti yang dijelaskan dalam halaman manual:sumber
#if __IPHONE_OS_VERSION_MIN_REQUIRED >= __IPHONE_4_3
Jika gagal, periksa kembali ke solusi lain.Sama seperti C, Anda akan melakukannya
(dengan asumsi yang Anda maksudkan termasuk 0 tetapi tidak termasuk 74, yang adalah apa yang dilakukan contoh Java Anda)
Sunting: Jangan ragu untuk mengganti
random()
atauarc4random()
untukrand()
(yang, seperti orang lain tunjukkan, cukup sial).sumber
Saya pikir saya bisa menambahkan metode yang saya gunakan di banyak proyek.
Jika saya akhirnya menggunakannya dalam banyak file saya biasanya mendeklarasikan makro sebagai
Misalnya
Catatan: Hanya untuk iOS 4.3 / OS X v10.7 (Lion) dan yang lebih baru
sumber
Ini akan memberi Anda angka floating point antara 0 dan 47
Atau sederhananya
Baik batas bawah dan atas bisa negatif juga. Contoh kode di bawah ini memberi Anda angka acak antara -35,76 dan +12,09
Konversi hasil menjadi nilai Integer bulat :
sumber
drand48
sebagai gantinya untuk floating point.Menurut halaman buku panduan untuk rand (3), fungsi keluarga rand telah usang secara acak (3). Ini disebabkan oleh fakta bahwa 12 bit rand () yang lebih rendah melewati pola siklik. Untuk mendapatkan nomor acak, cukup seed generator dengan memanggil srandom () dengan seed yang tidak ditandatangani, lalu panggil acak (). Jadi, yang setara dengan kode di atas adalah
Anda hanya perlu memanggil srandom () sekali dalam program Anda kecuali Anda ingin mengubah seed Anda. Meskipun Anda mengatakan Anda tidak ingin diskusi tentang nilai acak, rand () adalah penghasil angka acak yang cukup buruk, dan random () masih mengalami bias modulo, karena akan menghasilkan angka antara 0 dan RAND_MAX. Jadi, mis. Jika RAND_MAX adalah 3, dan Anda menginginkan angka acak antara 0 dan 2, Anda dua kali lebih mungkin mendapatkan 0 daripada 1 atau 2.
sumber
Lebih baik digunakan
arc4random_uniform
. Namun, ini tidak tersedia di bawah iOS 4.3. Untungnya iOS akan mengikat simbol ini saat runtime, bukan pada waktu kompilasi (jadi jangan gunakan arahan preprocessor #jika untuk memeriksa apakah tersedia).Cara terbaik untuk menentukan apakah
arc4random_uniform
tersedia adalah melakukan sesuatu seperti ini:sumber
Saya menulis kelas utilitas angka acak saya sendiri sehingga saya akan memiliki sesuatu yang berfungsi sedikit lebih seperti Math.random () di Jawa. Ini hanya memiliki dua fungsi, dan semuanya dibuat dalam C.
File tajuk:
File implementasi:
Ini adalah cara yang cukup klasik untuk menghasilkan pseudo-randoms. Dalam delegasi aplikasi saya, saya menelepon:
Kemudian saya katakan:
Perhatikan bahwa metode ini mengembalikan angka acak antara 0,0f (inklusif) dan 1.0f (eksklusif).
sumber
Sudah ada beberapa jawaban yang jelas dan jelas, tetapi pertanyaannya menanyakan angka acak antara 0 dan 74. Gunakan:
arc4random_uniform(75)
sumber
Pada iOS 9 dan OS X 10.11, Anda dapat menggunakan kelas GameplayKit baru untuk menghasilkan angka acak dalam berbagai cara.
Anda memiliki empat jenis sumber untuk dipilih: sumber acak umum (tanpa nama, ke sistem untuk memilih apa yang dilakukannya), linear congruential, ARC4 dan Mersenne Twister. Ini dapat menghasilkan int acak, float, dan bools.
Pada tingkat paling sederhana, Anda dapat menghasilkan angka acak dari sumber acak bawaan sistem seperti ini:
Itu menghasilkan angka antara -2.147.483.648 dan 2.147.483.647. Jika Anda ingin angka antara 0 dan batas atas (eksklusif) Anda akan menggunakan ini:
GameplayKit memiliki beberapa konstruktor yang mudah digunakan untuk bekerja dengan dadu. Misalnya, Anda dapat menggulung dadu enam sisi seperti ini:
Plus Anda dapat membentuk distribusi acak dengan menggunakan hal-hal seperti
GKShuffledDistribution
.sumber
Hasilkan angka acak antara 0 hingga 99:
Hasilkan angka acak antara 500 dan 1000:
sumber
// Contoh berikut akan menghasilkan angka antara 0 dan 73.
Keluaran:
nomor acak: 72
angka acak langkah 2: 52
sumber
Untuk game dev, gunakan random () untuk menghasilkan random. Mungkin setidaknya 5x lebih cepat daripada menggunakan arc4random (). Bias modulo tidak menjadi masalah, terutama untuk game, saat menghasilkan random menggunakan rentang acak penuh (). Pastikan untuk menyemai terlebih dahulu. Panggil srandomdev () di AppDelegate. Berikut beberapa fungsi pembantu:
sumber