Javascript 可以接受递增计数器并使其显示为唯一随机的算法或公式
我想知道是否有一个通用的公式,可以取一个递增的整数,然后通过一个模的形式将它移动到一个随机的位置,所以当你递增计数器时,它的输出值会跳来跳去,看起来是随机的,但是没有值会被击中两次。假设对数字集有一些限制,如16位整数(65536个整数)或32位整数等。。也许有一种方法可以让数字以某种方式下降,我不知道。这个序列是可以预测的,但是对于一个门外汉来说,它似乎是随机的,没有考虑太多 例如,可以将一个数字乘以2,使其不直接递增。但这并不十分复杂。您可能可以从集合的中间开始计算数字(如30103表示16位整数),然后乘以2并使用模数旋转数字,这样增加的幅度会更小。但你仍然可以看到一种模式 我想知道什么样的模式或方程式可以让递增的数字(在一组有界的整数中)通过,从而使输出看起来尽可能不可预测,同时它不会两次碰到同一个数字。通过这种方式,您可以让外行看到随机生成的ID,而不必事先将所有ID以随机顺序存储在数据库中。公式将从单个存储的整数生成它们。在这方面有什么可能,方程式是什么?理论上它能走多远 也许你可以把这个集合设为奇数,跳过每20个数字,以某种方式证明它最终会在整个集合中旋转而不重复。不过我想不出来 更新:这似乎是在,像,领域,但我不确定他们是否符合增加的限制,永远不重复的数字 是我发现并实现的,但它提供了一些重复项:/Javascript 可以接受递增计数器并使其显示为唯一随机的算法或公式,javascript,algorithm,math,integer,formula,Javascript,Algorithm,Math,Integer,Formula,我想知道是否有一个通用的公式,可以取一个递增的整数,然后通过一个模的形式将它移动到一个随机的位置,所以当你递增计数器时,它的输出值会跳来跳去,看起来是随机的,但是没有值会被击中两次。假设对数字集有一些限制,如16位整数(65536个整数)或32位整数等。。也许有一种方法可以让数字以某种方式下降,我不知道。这个序列是可以预测的,但是对于一个门外汉来说,它似乎是随机的,没有考虑太多 例如,可以将一个数字乘以2,使其不直接递增。但这并不十分复杂。您可能可以从集合的中间开始计算数字(如30103表示16
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:增量,一定是奇数
/*
假设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;i console.log(`generated${r.size}unique numbers`);
如果您要查找一个序列,其中一个值是通过知道前一个值是什么而生成的,那么您要查找的可能是a,模数为2的幂。涉及到几个参数:
- m