【发布时间】:2016-05-07 23:36:48
【问题描述】:
我是 C++ 学生,我正在创建一个随机数生成器。
事实上我应该说我的算法选择了一个定义范围内的数字。
我写这篇只是因为我的好奇心。
我不是在挑战现有的库函数。
在编写基于随机性的应用程序时,我总是使用库函数,但我再次声明,我只是出于好奇而想实现它。
我也想知道我的算法或方法是否有问题。 因为我在谷歌上搜索了 PRNG 的工作原理,并且在一些网站上他们说存在数学算法,并且预定义的数字序列和种子只是将指针设置在序列中的不同点,并且在一些间隔后序列会重复自身。
我的算法刚刚开始在可能值数组中来回移动,并且种子每次都以不同的值打破循环。我不认为这种方法是错误的。我得到了建议不同算法的答案,但他们没有解释我当前的算法有什么问题?
是的,我的种子有问题,因为它不精确,结果难以预测,如下所示:-
cout
运行四次的结果是74,93,56,79。
参见“递增顺序”的模式。
对于大范围的模式可以很容易地看到。我得到了关于获得好种子的答案,但也推荐了一种新算法(但没有说明原因?)。
另一种方法可能是随机打乱我的数组,每次都随机生成一个新序列。并且增加顺序的模式将会消失。任何重新排列的帮助也会很好。这是下面的代码。如果我的功能不可用请通知我。
谢谢你的期待。
int rn(int lowerlt, int upperlt)
{
/* Over short ranges, results are satisfactory.
* I want to make it effective for big ranges.
*/
const int size = upperlt - lowerlt; // Constant size of the integer array.
int ar[size]; // Array to store all possible values within defined range.
int i, x, ret; // Variables to control loops and return value.
long pointer = 0; //pointer variable. The one which breaks the main loop.
// Loop to initialize the array with possible values..
for (i=0, x=lowerlt; x <= upperlt; i++, x++)
ar[i]=x;
long seed = time(0);
//Main loop . To find the random number.
for (i=0; pointer <= seed; i++, pointer++)
{
ret = ar[i];
if (i == size-1)
{
// Reverse loop.
for (; i >= 0; i--)
{
ret=ar[i];
}
}
}
return ret;
}
【问题讨论】:
-
“主要问题”是编写 RNG 很难,没有什么特别推荐您采用的方法。这个问题的答案只包括建议另一种现有的算法,您也可以自己找到它,并获得更多好处。
-
@EJP 构建 RNG 很难与否,找到解决方案很重要。我知道库函数。我只是寻求一点帮助。我只是想知道不同的编程技术。我是新来的。
-
所以按照我的建议去找一个。而不是从猜测开始。你会学到很多东西。
-
@EJP 是的,我会找到一个。这就是我来这里的原因。
-
PRNG 是一个非常困难的主题,如果你想写一个有竞争力的 w.r.t.现有的实现。因此,要么使用现有的(来自
<random>),要么花费数年时间研究它们。或者编辑你的问题来解释你为什么要写一个。
标签: c++ c++11 shuffle random-seed