我需要一个能在给定范围内生成随机整数的函数(包括边界值).我没有不合理的质量/随机性要求,我有四个要求:
我目前有以下C++代码:
output = min + (rand() * (int)(max - min) / RAND_MAX)
Run Code Online (Sandbox Code Playgroud)
问题是,它并不是真正统一的 - 只有当rand()= RAND_MAX时才返回max(对于Visual C++,它是1/32727).这是小范围的主要问题,如<-1,1>,其中最后一个值几乎从不返回.
所以我抓住笔和纸,并提出了以下公式(它建立在(int)(n + 0.5)整数舍入技巧):

但它仍然没有给我统一的分配.对于值-1,0,0,重复运行10000个样本给出37:50:13的比率.
你能建议更好的配方吗?(甚至整个伪随机数发生器功能)
这就是我正在使用的.令牌不一定要被猜测,它更像是一个短网址标识符,而不是其他任何东西,我想保持简短.我已经按照我在网上找到的一些例子,如果发生碰撞,我认为下面的代码会重新创建令牌,但我不确定.不过,我很想看到更好的建议,因为边缘感觉有点粗糙.
def self.create_token
random_number = SecureRandom.hex(3)
"1X#{random_number}"
while Tracker.find_by_token("1X#{random_number}") != nil
random_number = SecureRandom.hex(3)
"1X#{random_number}"
end
"1X#{random_number}"
end
Run Code Online (Sandbox Code Playgroud)
我的令牌的数据库列是一个唯一的索引,我也在validates_uniqueness_of :token模型上使用,但因为这些是根据用户在应用程序中的操作自动批量创建的(他们下订单并购买令牌,基本上),它是让应用程序抛出错误是不可行的.
我猜,我也可以减少碰撞的几率,在最后添加另一个字符串,根据时间或类似的东西生成的东西,但我不希望令牌太长.
我是一名网络游戏开发者,我遇到了随机数问题.假设玩家有20%的几率用他的剑获得重击.这意味着,5次点击中的1次应该是至关重要的.问题是我的现实生活成绩非常糟糕 - 有时候球员在5次安打中得到3次降落,有时15次命中都没有.战斗相当短(3-10次命中),因此获得良好的随机分布非常重要.
目前我使用PHP mt_rand(),但我们只是将代码移动到C++,所以我想在游戏的新引擎中解决这个问题.
我不知道解决方案是否是一些统一的随机生成器,或者可能记住以前的随机状态以强制正确分配.
如果我有这样的枚举:
public enum Letter {
A,
B,
C,
//...
}
Run Code Online (Sandbox Code Playgroud)
随机选择一个的最佳方法是什么?它不需要是生产质量的防弹,但相当均匀的分布将是不错的.
我可以做这样的事情
private Letter randomLetter() {
int pick = new Random().nextInt(Letter.values().length);
return Letter.values()[pick];
}
Run Code Online (Sandbox Code Playgroud)
但有更好的方法吗?我觉得这是以前已经解决的问题.
我需要通过ActiveRecord从表中获取随机记录.我从2006年开始跟随Jamis Buck的例子.
但是,我也通过Google搜索遇到了另一种方式(由于新的用户限制,无法使用链接进行归因):
rand_id = rand(Model.count)
rand_record = Model.first(:conditions => ["id >= ?", rand_id])
Run Code Online (Sandbox Code Playgroud)
我很好奇这里的其他人是如何做到的,或者是否有人知道哪种方式会更有效率.
我试图在Go中生成一个随机字符串,这是我到目前为止编写的代码:
package main
import (
"bytes"
"fmt"
"math/rand"
"time"
)
func main() {
fmt.Println(randomString(10))
}
func randomString(l int) string {
var result bytes.Buffer
var temp string
for i := 0; i < l; {
if string(randInt(65, 90)) != temp {
temp = string(randInt(65, 90))
result.WriteString(temp)
i++
}
}
return result.String()
}
func randInt(min int, max int) int {
rand.Seed(time.Now().UTC().UnixNano())
return min + rand.Intn(max-min)
}
Run Code Online (Sandbox Code Playgroud)
我的实施很慢.播种使用time在一定时间内带来相同的随机数,因此循环一次又一次地迭代.我该如何改进我的代码?
在用C/C++编写的小应用程序中,我遇到了一个问题 rand函数也许是种子:
我想生成一系列具有不同顺序的随机数,即具有不同的对数值(基数为2).但似乎所有产生的数字都是相同的顺序,波动在2 ^ 25到2 ^ 30之间.
是因为rand()用Unix时间播种,现在是一个相对较大的数字?我忘记了什么?我rand()只在一开始播种一次main().
我需要一个快速算法从通用列表中选择5个随机元素.例如,我想从a获得5个随机元素List<string>.
我目前有一个n大小的Python集,其中n> = 0.是否有快速的1或2行Python解决方案来做到这一点?例如,该集合将如下所示:
fruits = set(['apple', 'orange', 'watermelon', 'grape'])
Run Code Online (Sandbox Code Playgroud)
目标是从上面选择2个随机项目,上述集合可能包含0个,1个或更多项目.我能想到的唯一方法是将集合转换为列表(可变),从中可以访问集合长度内的2个随机唯一索引.
是否有可能在2个双打之间生成一个随机数?
例:
public double GetRandomeNumber(double minimum, double maximum)
{
return Random.NextDouble(minimum, maximum)
}
Run Code Online (Sandbox Code Playgroud)
然后我用以下内容称呼它:
double result = GetRandomNumber(1.23, 5.34);
Run Code Online (Sandbox Code Playgroud)
任何想法将不胜感激.