相关疑难解决方法(0)

在固定间隔中产生明显的随机时间

我试图产生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)

sql t-sql sql-server sql-server-2008 random-time-generation

29
推荐指数
4
解决办法
8469
查看次数

在.NET中生成所有整数的随机,非重复序列

在.NET中是否有一种方法可以以随机顺序生成所有 32位整数(Int32)的序列,而不会重复,并且以内存效率的方式生成?内存效率意味着最多只能使用几百兆字节的主内存.

理想情况下,序列应该像a一样IEnumerable<int>,只有在请求时才会延迟返回下一个数字.

我做了一些快速研究,我找到了一些部分解决方案:

有另一种方式来看待这个问题 - 也许是考虑值的固定范围内的优势 - 这将给予满足存储需求的解决方案?也许.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. …

.net c# random algorithm int

29
推荐指数
2
解决办法
2863
查看次数

用于打印混洗列表的算法,就地并使用O(1)存储器

读完这个问题后,我开始怀疑:是否有可能有一个不改变或复制原始列表的改组算法?

说清楚:

想象一下,您将获得一个对象列表.列表大小可以是任意的,但假设它非常大(例如,10,000,000个项目).您需要以随机顺序打印列表中的项目,并且需要尽快完成.但是,你不应该:

  • 复制原始列表,因为它非常大并且复制会浪费大量内存(可能达到可用RAM的限制);
  • 修改原始列表,因为它以某种方式排序,之后的其他部分依赖于它的排序.
  • 创建一个索引列表,因为再次,列表非常大,复制需要花费太多时间和内存.(澄清:这意味着任何其他列表,其具有与原始列表相同数量的元素).

这可能吗?

补充:更多澄清.

  1. 我希望列表以真正的随机方式进行混洗,所有排列都同样可能(当然,假设我们有一个合适的Rand()函数开始).
  2. 建议我制作一个指针列表,或一个索引列表,或任何其他列表与原始列表具有相同数量的元素,由原始问题明确地认为是低效的.如果需要,您可以创建其他列表,但它们应该比原始列表小很多.
  3. 原始列表就像一个数组,您可以通过其在O(1)中的索引从中检索任何项目.(所以没有双重链接列表的东西,你必须遍历列表才能找到你想要的项目.)

添加2:好的,让我们这样说吧:你有一个装有数据项的1TB硬盘,每个512字节大(一个扇区).您希望将所有这些数据复制到另一个1TB HDD,同时洗牌所有项目.您希望尽快完成此操作(单次传递数据等).您有512MB的RAM可用,并且不依赖于交换.(这是一个理论场景,我在实践中没有这样的东西.我只是想找到完美的algorithm.item.)

theory algorithm shuffle

11
推荐指数
2
解决办法
1179
查看次数

在SQL Server中生成看似随机的唯一数字ID

我需要使用SQL Server生成看似随机的唯一8位数字 ID(可以在前面填充零).这是否有内置功能?我看到了这个 Identity属性,但它是顺序的,而不是随机的.

如果这是不可能的,那么直接将随机生成的ID写入db然后检查异常是一种好习惯吗?(请注意,我的应用程序是多线程的,因此在写入之前进行检查并不能保证唯一性,除非在原子操作中完成.)

谢谢!

更新:添加"数字"以澄清.编辑表明随机性不需要加密强或任何接近.看似随机就好了.奥利弗提出了一个优雅的解决方案,我已经使用这种方法发布了答案.谢谢,奥利弗!

c# sql-server asp.net-mvc

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