小编and*_*ora的帖子

生成全周期/全周期随机数或排列类似于LCG但没有奇数/偶数

我希望生成一个伪随机数/置换,它在一个范围内"占据"一个完整的周期或整个周期.通常,"线性同余发生器"(LCG)可用于生成此类序列,使用如下公式:

X = (a*Xs+c) Mod R
Run Code Online (Sandbox Code Playgroud)

其中Xs是种子,X是结果,a和c是相对的素数常数,R是最大值(范围).

(通过完整周期/完整周期,我的意思是可以选择常数,使得任何X在一些随机/置换序列中仅出现一次,并且将在0到R-1或1到R的范围内).

LCG几乎满足了我的所有需求.我对LCG的问题是奇数/偶数结果的非随机性,即:对于种子Xn,结果X将交替奇数/偶数.

问题:

  1. 有没有人知道如何创造类似的东西,不会交替奇/偶?

  2. 我相信可以建立'复合LCG',但我没有细节.有人可以举一个这个CLCG的例子吗?

  3. 是否有替代公式可能符合上述细节和下面的约束?

约束:

  1. 我想要一些基于种子的简单公式.即:为了获得下一个数字,我提供种子并获得置换序列中的下一个"随机数".具体来说,我不能使用预先计算的数组.(见下一点)
  2. 序列绝对必须是'全周期/完整周期'
  3. 范围R可能是几百万甚至32比特/ 40亿.
  4. 计算不应该溢出并且有效/快速,即:没有大的指数或几十个乘法/除法.

  5. 序列不一定非常随机或安全 - 我不需要加密随机性(但如果可行则可以使用它),只需要"好"随机性或明显随机性,没有奇数/偶数序列.

任何想法都赞赏 - 提前感谢.

更新:理想情况下,Range变量可能不是2的精确幂,但在任何一种情况下都应该有效.

random algorithm numerical-methods

8
推荐指数
2
解决办法
4709
查看次数

如何在验证访问权限时避免使用密钥记录器

实际上,根据标题,在验证访问权限时可以做些什么来击败键/击键记录?

我刚刚发布了一个相关的问题(如何存储和验证数字 -从一个密码中随机选择),询问从PIN /密码中选择随机数字的建议.还有哪些其他合理不显眼的方法?

任何和所有解决方案赞赏.

authentication passwords defensive-programming

7
推荐指数
3
解决办法
656
查看次数

使用位域或按位运算符在一个字节内移动一点

是否有一种优雅的方式在一个字节(或字/长)内移动一点.为简单起见,我们使用一个简单的8位字节,只需一位在字节内移动.

给定一个位数,基于0-7最小sig位到大多数sig位(或者如果你更愿意位1-8位),我想从一个位置移动到另一个位置:

7654 3210 <bit position
0101 1010 <some binary value
--x- --y- <move bit from x to y
0111 0100 <new value with x moved to y and intervening bits shifted left
Run Code Online (Sandbox Code Playgroud)

因此,位位置5处的x在位位置1处移动到y,位0,6,7保持不变.位2,3,4向左移动到"腾出空间",位数从5移动到2.这只是一个例子.

该位移动非常重要,而不是与其目标交换.有许多比特的例子可以互换,但这非常简单.

理想情况下,该解决方案将使用简单的bit-twiddling和bitwise运算符.假设语言不可知,位简单AND/OR/XOR,NOT,SHIFT左/右/ ROTATE或类似指令在任何组合中都可以,加上任何其他基本算术运算符,例如:mod,加/减等.甚至工作伪 - 代码没问题.或者,位阵列或位域类型结构可能很简单.

除了实际的位移动,我想找到一种方法:

  • 向上或向下移动任何位.
  • 以任何方便的格式指定位号源/目标:例如:6> 2表示向下移位,3> 7向上移位或开始位+/-偏移:6-4或3 + 4,或位加权:位6 = 64到3位= 8.
  • 可能从byte扩展到unsigned int,long等.
  • (理想情况下,一次可扩展到多个位,如果更容易可能相邻位)

性能不是一个主要问题,但优雅的东西可以足够快.

我自己的niaive方法是识别源位和目标位位置,决定是上移还是下移,移位复制,屏蔽静态位并找到源位,合并静态位和移位位并以某种方式设置/清除目标位.然而,虽然理论看起来不错,但优雅的实现却超出了我的范围.

我意识到可以为一个字节构建一个预编译的查找表,但如果要将它扩展为整数/长整数,这对我来说是不切实际的.

任何帮助赞赏.提前致谢.

language-agnostic puzzle bit-manipulation bit

5
推荐指数
1
解决办法
2418
查看次数

如何使用VBScript(或VB6)从字节/整数数组中插入原始/二进制字段值?

有没有人知道如何使用SQL将几个字节传递到二进制(或varbinary)字段,理想情况下是在ADO(经典)和VBScript(或Visual Basic 6)中?

我希望编码10-20(可能更多)字节的数据,并将此数据存储在SQL db字段中.(它不是MS-SQLSVR,但我希望标准的SQL支持格式能够正常工作!)

这些字节可用作通过AscB/ChrB获得的字节串,OR,一个'bytes'数组(实际上是通过'cbyte'获得的字节类型的变体)并存储在数组中.

第一个选项:使用字符串格式 我已经有一些(有限的)成功创建SQL插入:

x = ".>?hD-&91k[="    '<psuedo string of chars, some unprintable
Insert Into rawtest (byt) Values (CAST('" & x & "' as SQL_BINARY(12)))
Run Code Online (Sandbox Code Playgroud)

但我担心字符串空值会截断字段中的数据,而其他非打印控制字符将妨碍处理数据.有办法避免这种情况吗?

第二个选项:字节数组 我可以很容易地将数据放入数组中,但无法看到如何传递给SQL Insert语句.如果我尝试传入12个字节,则由于CAST尝试将数据存储到整数(4字节),插入失败.如果我传入单个字节,它可以工作,例如:

x = a(0)
Run Code Online (Sandbox Code Playgroud)

并继续工作4个字节,但在Integer溢出时失败.此外,它重新排序数据

我试图使用各种变通方法:

Insert Into rawtest (byt) Values (CAST('12,34,45' as SQL_BINARY(12)))
Insert Into rawtest (byt) Values (CAST(&h12&h34 as SQL_BINARY(12)))
Insert Into rawtest (byt) Values (CAST(0x123456789012 as SQL_BINARY(12)))
Run Code Online (Sandbox Code Playgroud)

我也尝试过类似的组合:

Insert Into rawtest (byt) Values (CONVERT('" & x & "', SQL_BINARY)
Run Code Online (Sandbox Code Playgroud)

但这些都失败了!

理想情况下,我想要一个方法,任何方法,它采用一个最多20个字节的小二进制数组(理想情况下完整字节范围为0-255,但可能需要更少)并将它们传递给普通的原始二进制SQL字段.

理想情况下,我需要在VBScript/ADO中执行此操作,但如果可用,则可以使用基于VB6的解决方案.我想把它作为'原始'二进制文件,我不想使用ascii编码,比如Base64.

我用谷歌搜索,直到我麻木,并没有发现与SQL中的二进制字段相关的很多东西.

你能帮我吗?任何答案都赞赏.很多thx.

sql vb6 binary vbscript ado

3
推荐指数
1
解决办法
2万
查看次数

是否有运行Javascript的本地运行时环境?(比如JScript的Windows Scripting Host)

我想知道是否有一个"本地运行时环境"用于托管Javascript代码,这不是基于浏览器的,用于运行小型本地应用程序?类似于WSH(Windows Scripting Host)的JavaScript(不是MS-JScript).

我想在本地运行一些javascript脚本,就像我可能用于VBScript(VBS)一样,可能会出现以下情况:

  1. 访问本地文件(可能通过FSO对象)
  2. 简单的控制台读/写
  3. 最新版本的Javascript
  4. 某种形式的简单调试

或者,如何考虑仅在"本地"模式下运行浏览器?即:启动,运行代码,退出,也许使用命令行开关/选项,没有太多的开销?如果是这样,哪个浏览器?火狐?有可能以某种方式"提取"JS运行时引擎/ DLL并调用它吗?

那么,简而言之,像WSH这样的东西只适用于javascript?

谢谢.

javascript vbscript wsh jscript

3
推荐指数
1
解决办法
3983
查看次数