我试图产生8:00 AM至8:00 PM之间的随机时间为每一行是从数据集选择的,但是,我总是得到相同的随机值的每一行 -我想这是不同的每一行.
表模式和数据:
?????????????????????????
? ID ? CREATED_DATE ?
?????????????????????????
? ID/1 ? 26/04/2014 ?
? ID/2 ? 26/04/2014 ?
? ID/3 ? 26/04/2014 ?
? ID/4 ? 26/04/2014 ?
? ID/5 ? 26/04/2014 ?
?????????????????????????
Run Code Online (Sandbox Code Playgroud)
СurrentSQL语句:
SELECT [ID]
, MyFunction.dbo.AddWorkDays(14, [CREATED_DATE]) AS [New Date]
, CONVERT(VARCHAR, DATEADD(MILLISECOND, CAST(43200000 * RAND() AS INT), CONVERT(TIME, '08:00')), 114) AS [New Time]
FROM [RandomTable]
Run Code Online (Sandbox Code Playgroud)
当前结果(列中每行的相同时间[New Time]):
??????????????????????????????????????????
? ID ? …Run Code Online (Sandbox Code Playgroud) 在.NET中是否有一种方法可以以随机顺序生成所有 32位整数(Int32)的序列,而不会重复,并且以内存效率的方式生成?内存效率意味着最多只能使用几百兆字节的主内存.
理想情况下,序列应该像a一样IEnumerable<int>,只有在请求时才会延迟返回下一个数字.
我做了一些快速研究,我找到了一些部分解决方案:
Random)直到它不重复,即它不在集合中 - 除了可能无法满足内存要求之外,在生成最后一个数字时它会变得非常慢顺序.有另一种方式来看待这个问题 - 也许是考虑值的固定范围内的优势 - 这将给予满足存储需求的解决方案?也许.NET类库带有一些有用的东西?
更新1
感谢大家对解决方案的见解和创意建议.我将尝试尽快实施和测试(正确性和内存效率)这里提出的2或3个最有希望的解决方案,发布结果然后选择"赢家".
更新2
我试着在下面的评论中实现hvd的建议.我尝试使用BitArray.NET和我的自定义实现,因为.NET只限于int.MaxValue条目,因此不足以覆盖整个整数范围.
我喜欢这个想法的简单性,如果它工作正常,我愿意"牺牲"那512 MB的内存.不幸的是,运行时间非常慢,花费数十秒来生成我的机器上的下一个随机数,它具有3.5 GHz Core i7 CPU.所以不幸的是,如果要求生成许多随机数,这是不可接受的.我猜这是可以预测的,如果我没有弄错的话,它是一个O(M x N)算法,其中N是2 ^ 32而M是请求的整数的数量,因此所有这些迭代都需要付出代价.
理想情况下,我想在O(1)时间内生成下一个随机数,同时仍满足内存要求,这里建议的下一个算法可能适用于此.我会尽快给他们试一试.
更新3
我刚刚测试了线性同余发生器,我可以说我对结果非常满意.对于这个帖子中的赢家位置来说,它看起来像是一个强有力的竞争者.
正确性:所有整数只生成一次(我使用了一个位向量来检查).
随机性:相当不错.
内存使用:非常好,只需几个字节.
运行时间:非常快速地生成下一个随机整数,正如您可以从O(1)算法中获得的那样.生成每个整数总共花费大约.在我的机器上11秒.
总而言之,如果你不是在寻找高度随机化的序列,我会说这是一种非常合适的技术.
更新4
下面描述的模乘乘逆技术与LCG技术的行为非常相似 - 这并不奇怪,因为两者都是基于模运算 - 尽管我发现为了产生令人满意的随机序列,它实现起来并不那么简单.
我发现一个有趣的区别是这种技术似乎比LCG更快:生成整个序列需要大约8秒,而LCG则需要11秒.除此之外,关于内存效率,正确性和随机性的所有其他评论都是相同的.
更新5
看起来用户TomTom在没有通知的情况下删除了他们的答案,我在评论中指出我发现它比所需的更快地生成重复的数字.所以我想这完全排除了Mersenne Twister. …
读完这个问题后,我开始怀疑:是否有可能有一个不改变或复制原始列表的改组算法?
说清楚:
想象一下,您将获得一个对象列表.列表大小可以是任意的,但假设它非常大(例如,10,000,000个项目).您需要以随机顺序打印列表中的项目,并且需要尽快完成.但是,你不应该:
这可能吗?
补充:更多澄清.
添加2:好的,让我们这样说吧:你有一个装有数据项的1TB硬盘,每个512字节大(一个扇区).您希望将所有这些数据复制到另一个1TB HDD,同时洗牌所有项目.您希望尽快完成此操作(单次传递数据等).您有512MB的RAM可用,并且不依赖于交换.(这是一个理论场景,我在实践中没有这样的东西.我只是想找到完美的algorithm.item.)
我需要使用SQL Server生成看似随机的唯一8位数字 ID(可以在前面填充零).这是否有内置功能?我看到了这个 Identity属性,但它是顺序的,而不是随机的.
如果这是不可能的,那么直接将随机生成的ID写入db然后检查异常是一种好习惯吗?(请注意,我的应用程序是多线程的,因此在写入之前进行检查并不能保证唯一性,除非在原子操作中完成.)
谢谢!
更新:添加"数字"以澄清.编辑表明随机性不需要加密强或任何接近.看似随机就好了.奥利弗提出了一个优雅的解决方案,我已经使用这种方法发布了答案.谢谢,奥利弗!