rand & random & arc4random
rand(3) / random(3) / arc4random(3) / et al.
Written by Mattt Thompson on August 12th, 2013
What passes for randomness is merely a hidden chain of causality.
In a mechanical universe of material interactions expressed through mathematical equations, it is unclear whether nature encodes an element of chance, or if it's a uniquely human way to reconcile uncertainty.
We can be sure of one thing, however: in the closed, digital universe of CPU cycles, processes, and threads, there is no true randomness, only pseudorandomness.
Pseudorandomness, is often implemented in a way very similar to a cryptographic hash, as a deterministic function that returns a value based on the current time (salted, of course, by some initial seed value). Also like hash functions, there are a number of PRNG, or pseudorandom number generators, each of which are optimized for particular performance characteristics: uniformity, periodicity, and computational complexity.
Of course, for app developers, all of this is an academic exercise. And rather than bore you with any more high-minded, long-winded treatises on the philosophical nature of randomness, we're going to tackle this one FAQ-style.
Our goal this week: to clear up all of the lingering questions and misunderstandings about doing random things in Objective-C. Let's dive in!
How Do I Generate a Random Number in Objective-C?
tl;dr: Use arc4random() and its related functions.
Specifically, to generate a random number between 0 and N - 1, use arc4random_uniform(), which avoids modulo bias.
Random int between 0 and N - 1
NSUInteger r = arc4random_uniform(N);
Random int between 1 and N
NSUInteger r = arc4random_uniform(N) + 1;
Random double between 0 and 1
If you are generating a random double or float, another good option is the more obscure rand48family of functions, including drand48(3).
srand48(time(0));
double r = drand48();
rand48functions, unlikearc4randomfunctions, require an initial value to be seeded before generating random numbers. This seed function,srand48(3), should only be run once.
How Do I Pick a Random Element from an NSArray?
Use arc4random_uniform(3) to generate a random number in the range of a non-empty array.
if ([array count] > 0) {
id obj = array[arc4random_uniform([array count])];
}
How Do I Randomly Order an NSArray?
NSMutableArray *mutableArray = [NSMutableArray arrayWithArray:array];
NSUInteger count = [mutableArray count];
// See http://en.wikipedia.org/wiki/Fisher–Yates_shuffle
if (count > 1) {
for (NSUInteger i = count - 1; i > 0; --i) {
[mutableArray exchangeObjectAtIndex:i withObjectAtIndex:arc4random_uniform((int32_t)(i + 1))];
}
}
NSArray *randomArray = [NSArray arrayWithArray:mutableArray];
This code is borrowed from TTTRandomizedEnumerator, which also provides randomized enumerators for
NSSet,NSOrderedSet, andNSDictionary.
How Do I Generate a Random String?
If you're looking to generate "lorem ipsum"-style sentences, try constructing a Markov Chain from a corpus.
Otherwise, if you're looking to just get random letters, try one of the following methods:
Generate a Random Lowercase NSString
If you are operating on a known, contiguous range of Unicode characters, such as the lowercase letters (U+0061 — U+007A), you can do a simple conversion from a char:
NSString *letter = [NSString stringWithFormat:@"%c", arc4random_uniform(26) + 'a'];
Pick a Random Character From an NSString
Otherwise, a simple way to pick random letters from a set of your choosing is to simply create a string containing all of the possible letters:
NSString *vowels = @"aeiouy";
NSString *letter = [vowels substringWithRange:NSMakeRange(arc4random_uniform([vowels length]), 1)];
Why Should I Use arc4random(3) instead of rand(3) or random(3)?
C functions are typically denoted with a number
3inside of parentheses, following the organizational convention ofmanpages.
arc4randomdoes not require an initial seed (withsrandorsrandom), making it that much easier to use.arc4randomhas a range up to0x100000000 (4294967296), whereasrandandrandomtop out atRAND_MAX = 0x7fffffff (2147483647).randhas often been implemented in a way that regularly cycles low bits, making it more predictable.
What are rand(3), random(3), and arc4random(3), and Where Do They Come From?
randis a standard C function.randomis defined as part of the POSIX standard.arc4randomis provided on BSD and derived platforms.
If you have any additional questions about randomness on Objective-C, feel free to tweet @NSHipster. As always, corrections are welcome in the form of a pull request.
|
1
2
|
Math.random()*(n-m)+m;改正公式:Math.random()*(n+1-m)+m |
|
1
|
document.write(Math.random()); |
|
1
|
document.write(Math.random()*(20-10)+10); |
|
1
|
document.write(Math.random()*(n+1-m)+m); |
/// <summary>
/// 获取指定区间的随机数
/// </summary>
/// <param name="min">The minimum.</param>
/// <param name="max">The maximum.</param>
/// <returns></returns>
public static int GetRandom(int min = , int max = )
{
return new Random(GetRandomSeed()).Next(min, max+);
} /// <summary>
/// 加密随机数生成器 生成随机种子
/// </summary>
/// <returns></returns>
public static int GetRandomSeed()
{ byte[] bytes = new byte[]; System.Security.Cryptography.RNGCryptoServiceProvider r = new System.Security.Cryptography.RNGCryptoServiceProvider(); r.GetBytes(bytes); return BitConverter.ToInt32(bytes, ); }
rand & random & arc4random的更多相关文章
- iPhone开发随想:rand()还是arc4random()
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://bj007.blog.51cto.com/1701577/544006 今天在iP ...
- sql随机查询数据语句(NewID(),Rnd,Rand(),random())
SQL Server: 代码如下 复制代码 Select TOP N * From TABLE Order By NewID() NewID()函数将创建一个 uniqueidentifier 类型的 ...
- iOS中产生随机数的方法
利用arc4random_uniform()产生随机数 Objective-C 中有个arc4random()函数用来生成随机数且不需要种子,但是这个函数生成的随机数范围比较大,需要用取模的算法对随机 ...
- objective-c 中随机数的用法 3种:arc4random() 、random()、CCRANDOM_0_1()
oc 中随机数的用法(arc4random() .random().CCRANDOM_0_1() 1).arc4random() 比较精确不需要生成随即种子 使用方法 : 通过arc4random() ...
- Verilog $random用法
“$random函数调用时返回一个32位的随机数,它是一个带符号的整形数...”,并给出了一个例子: _________________________________________________ ...
- pwnable.kr random 之 write up
---恢复内容开始--- 首先看源代码: #include <stdio.h> int main(){ unsigned int random; random = rand(); // r ...
- day 5 模块导入、常用模块os shutil sys commands subprocess hashlib json pickle zipfile traceback random datetime
os: os.getcwd() 获取当前工作目录,即当前python脚本工作的目录路径 os.chdir("dirname") 改变当前脚本工作目录:相当于shell下cd os. ...
- reservoir sampling / random shuffle
randomly choose a sample of k items from a list S containing n elements, the algorithm may be online ...
- verilog random使用
“$random函数调用时返回一个32位的随机数,它是一个带符号的整形数...”,并给出了一个例子: _________________________________________________ ...
随机推荐
- js判断qq浏览器
if(navigator.userAgent.toLowerCase().toString().indexOf('qqbrowser') > -1){ console.log('qq');}el ...
- CentOS6.4下基于Nginx搭建mp4/flv流媒体服务器
我的步骤如下:1. 安装依赖包: yum install glibc.i686#yum –y update#yum -y install gcc glibc glibc-devel make nasm ...
- 小游戏Step表
[Config]1|0|0|2|172,120,134|公主的记忆|1|2[Config] [Config]2|1|1|2|172,120,134|公主的记忆|1|2[Config] [Config] ...
- 将已有项目提交到github/从github上pull到本地
去自己的工作分支$ git checkout work 工作.... 提交工作分支的修改$ git commit -a 回到主分支$ git checkout master 获取远程最新的修改,此时不 ...
- jstl_fmt
<fmt:formatDate value="${isoDate}" type="both"/>2004-5-31 23:59:59<fmt: ...
- oracle 递归应用(挺复杂的)
最近做数据过滤觉得很有必要记录下整个过程,说不定下次就不知道了. 废话不多说开始: 表结构: 企业表(自关联,采用树的形式记录分子公司) 区域表(自关联,采用树的形式记录省/市/县/乡,数据量大) 公 ...
- Java中使用二重循环打印沙漏图形
1.首先判断外层,A .B.C.D都符合条件 2.那么再看内层 A :int i=0;i<5;i++ 当i=1时;带入到第二个内层循环中 int j=0;j<Math.abs(i)*2+1 ...
- js数组去重的方法
//数组去重 Array.prototype.unique = function() { var newArr = [], hash = {}; for(var i=0, len=this.lengt ...
- gnome3.X添加开机启动项
背景:升级gnome后发现gnome-session-properties不见了,想把sslocal随机启动遇到了麻烦... 特别说明:此为图形桌面开机启动项,因此只有通过图形桌面登陆用户后才能启动. ...
- 关于启动ubuntu中的nfs启动问题
嵌入式开发,如果使用nfs挂载来启动内核和文件系统,这样便于调试文件系统和驱动,则首先要保证ubuntu开启nfs服务, 执行以下命令安装nfs服务,安装后自动运行 sudo apt-get inst ...