Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/473.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 可以接受递增计数器并使其显示为唯一随机的算法或公式_Javascript_Algorithm_Math_Integer_Formula - Fatal编程技术网

Javascript 可以接受递增计数器并使其显示为唯一随机的算法或公式

Javascript 可以接受递增计数器并使其显示为唯一随机的算法或公式,javascript,algorithm,math,integer,formula,Javascript,Algorithm,Math,Integer,Formula,我想知道是否有一个通用的公式,可以取一个递增的整数,然后通过一个模的形式将它移动到一个随机的位置,所以当你递增计数器时,它的输出值会跳来跳去,看起来是随机的,但是没有值会被击中两次。假设对数字集有一些限制,如16位整数(65536个整数)或32位整数等。。也许有一种方法可以让数字以某种方式下降,我不知道。这个序列是可以预测的,但是对于一个门外汉来说,它似乎是随机的,没有考虑太多 例如,可以将一个数字乘以2,使其不直接递增。但这并不十分复杂。您可能可以从集合的中间开始计算数字(如30103表示16

我想知道是否有一个通用的公式,可以取一个递增的整数,然后通过一个模的形式将它移动到一个随机的位置,所以当你递增计数器时,它的输出值会跳来跳去,看起来是随机的,但是没有值会被击中两次。假设对数字集有一些限制,如16位整数(65536个整数)或32位整数等。。也许有一种方法可以让数字以某种方式下降,我不知道。这个序列是可以预测的,但是对于一个门外汉来说,它似乎是随机的,没有考虑太多

例如,可以将一个数字乘以2,使其不直接递增。但这并不十分复杂。您可能可以从集合的中间开始计算数字(如30103表示16位整数),然后乘以2并使用模数旋转数字,这样增加的幅度会更小。但你仍然可以看到一种模式

我想知道什么样的模式或方程式可以让递增的数字(在一组有界的整数中)通过,从而使输出看起来尽可能不可预测,同时它不会两次碰到同一个数字。通过这种方式,您可以让外行看到随机生成的ID,而不必事先将所有ID以随机顺序存储在数据库中。公式将从单个存储的整数生成它们。在这方面有什么可能,方程式是什么?理论上它能走多远

也许你可以把这个集合设为奇数,跳过每20个数字,以某种方式证明它最终会在整个集合中旋转而不重复。不过我想不出来

更新:这似乎是在,像,领域,但我不确定他们是否符合增加的限制,永远不重复的数字

是我发现并实现的,但它提供了一些重复项:/

const fetch=(x,o)=>{
如果(x>=o){
返回x
}否则{
常数v=(x*x)%o
返回(x获取(x,4294967291)
常量fetch16=(x)=>fetch(x,65519)
常量fetch8=(x)=>fetch(x251)
//最后一个数字可以是任何数字。
constbuild32=(x,o)=>fetch32((fetch32(x)+o)^1542469173)
constbuild16=(x,o)=>fetch16((fetch16(x)+o)^42703)
常量build8=(x,o)=>fetch8((fetch8(x)+o)^101)
设i=0
设n=Math.pow(2,32)
而(i
var bottomLimit=1
var topLimit=10
var arr=[]
对于(var i=下限;i<上限;i++){
arr.push(一)
}
arr=随机播放(arr);
控制台日志(arr);
//https://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array#answer-2450976
函数洗牌(数组){
var currentIndex=array.length,
时间值,随机指数;
而(0!==currentIndex){
randomIndex=Math.floor(Math.random()*currentIndex);
currentIndex-=1;
临时值=数组[currentIndex];
数组[currentIndex]=数组[randomIndex];
数组[randomIndex]=临时值;
}
返回数组;
}
var bottomLimit=1
var topLimit=10
var arr=[]
对于(var i=下限;i<上限;i++){
arr.push(一)
}
arr=随机播放(arr);
控制台日志(arr);
//https://stackoverflow.com/questions/2450954/how-to-randomize-shuffle-a-javascript-array#answer-2450976
函数洗牌(数组){
var currentIndex=array.length,
时间值,随机指数;
而(0!==currentIndex){
randomIndex=Math.floor(Math.random()*currentIndex);
currentIndex-=1;
临时值=数组[currentIndex];
数组[currentIndex]=数组[randomIndex];
数组[randomIndex]=临时值;
}
返回数组;

}
那么,您可以在两个编号的范围内生成随机编号

 public static int getRandomVal(int min, int max) {
    Random random = new Random();

    return random.nextInt((max - min) + 1) + min;
}

public static void getRandomNumbers(int size, int min,
        int max) {
    ArrayList<Integer> numbers = new ArrayList<Integer>();

    while (numbers.size() < size) {
        int random = getRandomVal(min, max);

        if (!numbers.contains(random)) {
            numbers.add(random);
            System.out.println(" "+random);
        }
    }
}

这种方法非常简单,我创建一个数组,只要检查随机值是否已经存在。如果它不存在,我就将其推送到数组并输出。

好的,您可以在两个no的范围内生成随机no

 public static int getRandomVal(int min, int max) {
    Random random = new Random();

    return random.nextInt((max - min) + 1) + min;
}

public static void getRandomNumbers(int size, int min,
        int max) {
    ArrayList<Integer> numbers = new ArrayList<Integer>();

    while (numbers.size() < size) {
        int random = getRandomVal(min, max);

        if (!numbers.contains(random)) {
            numbers.add(random);
            System.out.println(" "+random);
        }
    }
}

这种方法非常简单,我正在创建一个数组,只要检查随机值是否已经存在。如果它不存在,我将把它推到数组并输出。

如果您正在寻找一个序列,其中一个值是通过知道前一个值是什么而产生的,那么您要寻找的可能是一个,带有幂的模数为2。涉及几个参数:

  • m:模数,在你的例子中是28216或232
  • a:乘数。为了确保在生成第一个副本之前生成所有值,该乘数必须是4加1的倍数(假设m是2的幂)
  • c:增量,一定是奇数
你可以利用这些数字得出一系列你满意的“随机性”

上面引用的Wikipedia文章列出了一些伪随机生成器中使用的参数选择。我刚刚选择了a=97和c一些范围一半的奇数

下面是一些代码来证明其唯一性:

/*
假设m是2的幂:
-c一定是奇数
-%4必须是1
*/
函数createFetch(m,a,c){//返回一个函数
返回x=>(a*x+c)%m;
}
常数m=2**16;
const fetch16=createFetch(m,97,(m>>1)-1);
常数r=新集合;
设x=1;
for(设i=0;iconsole.log(`generated${r.size}unique numbers`);
如果您要查找一个序列,其中一个值是通过知道前一个值是什么而生成的,那么您要查找的可能是a,模数为2的幂。涉及到几个参数:

  • m