在.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. …
根据MSDN,如果您正在开发开源软件,建议您将用于强命名程序集的私钥和公钥都包含在公共源代码控制系统中:
如果您是一名开源开发人员,并且希望获得强名称程序集的身份优势,请考虑将与程序集关联的私钥检入源控制系统.
这让我很困惑.将私钥公开?在这种情况下,非对称加密的整个目的和安全性不会被打败吗?
我在同一篇文章中看到这个说明:
不要依赖强名称来保证安全.它们仅提供独特的身份.
这无助于减少我的困惑.如果安全不是目的,为什么然后使用私钥 - 公钥对?.NET中的强命名机制是否以不恰当的方式使用私有 - 公共密钥对?我的猜测是我错过了或误解了什么.
我需要编写代码来处理使用HttpClient.Net Framework 4.5附带的对象发出HTTP请求后可能出现的两种不同类型的故障:
连接失败,当由于连接问题而无法访问服务器时 - 例如没有可用连接,超时到期,网络设置不正确等.
虽然技术上并非失败,但是请求成功到达服务器但服务器以HTTP错误状态代码(例如404,400,409,500等)响应的情况
一种失败类型不被视为另一种失败是非常重要的.这是正确可靠的方法吗?该EnsureSuccessStatusCode()方法似乎至少有助于第二种情况,但文档令人失望.
我在Umm Al-Qura日历中有以下阿拉伯语日期,我要解析为.NET DateTime对象:
الأربعاء,17ذوالحجة,1436
此日期相当于公历中的2015年9月30日.
我一直在尝试使用以下"标准"C#代码来解析这个日期,但没有成功:
var cultureInfo = new CultureInfo("ar-SA");
cultureInfo.DateTimeFormat.Calendar = new UmAlQuraCalendar(); // the default one anyway
var dateFormat = "dddd? dd MMMM? yyyy"; //note the ? instead of ,
var dateString = "??????????? 17? ?? ??????? 1436";
DateTime date;
DateTime.TryParseExact(dateString, dateFormat, cultureInfo.DateTimeFormat, DateTimeStyles.AllowWhiteSpaces, out date);
Run Code Online (Sandbox Code Playgroud)
无论我做什么,结果TryParseExact总是如此false.如何在.NET中正确解析此字符串?
顺便说一句,如果我从一个DateTime对象开始,我可以ToString()在DateTime没有问题的情况下使用's overloads 创建上面的确切日期字符串.我显然不能以相反的方式做到这一点.
我正在开发一个ASP.NET Web API应用程序,它使用自定义日期时间http标头响应客户端.虽然我已经阅读了几篇描述如何从ASP.NET/IIS中删除响应头的文章,但这个文章似乎总是很有弹性,我无法摆脱它.它似乎被放置在程序员/管理员控制之外的某个响应管道中,最后.
我知道不在响应中包含"Date"标头可能是一种不好的做法,但正如我所提到的,自定义日期时间标题(以刻度而不是字符串表示形式)使默认值为冗余; 此外,这是一个私有API,所以我确切地知道谁和如何使用它.
因此,可以以任何方式在IIS(v7 +)中为特定站点(或直接从Web API应用程序)中删除此标头吗?
编辑:
我尝试了(没有成功)以下技术:
<httpProtocol><customHeaders>部分中明确删除web.config中的标头protected void Application_PreSendRequestHeaders(object sender, EventArgs e)方法中的标头删除代码Global.asax.cs我需要在启动该应用程序之后但在可能未收到任何客户端请求之前,找出IIS 7.5+中托管的ASP.NET Web API应用程序的基本URI。我需要的场景如下:通过独立于用户请求运行的计时器执行定期检查,该计时器与应用程序启动(相同的过程)一起触发;如果此检查通过某些条件,则某些注册用户将收到一封电子邮件,其中包含指向我的Web应用程序的超链接。现在,我不想对链接进行硬编码,而是从Web应用程序本身动态获取它。从客户端请求的上下文中找出它,然后将其缓存在内存中会很简单,但是,正如您可以想象的那样,计时器可能会在任何请求到达服务器之前关闭。
然后如何正确确定应用程序的基本URI?Global.asax.cs在Web应用程序启动期间,我一直认为最合适的位置是文件,但找不到任何有用的东西。
有没有办法阻止 .NET 的XmlReader类在读取内容时将 XML 实体扩展为其值?
例如,假设使用以下 XML 作为输入:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE author PUBLIC "ISO 8879:1986//ENTITIES Added Latin 1//EN//XML" "http://www.oasis-open.org/docbook/xmlcharent/0.3/iso-lat1.ent" >
<author>á</author>
Run Code Online (Sandbox Code Playgroud)
我们假设不可能达到扩展急性实体所需的外部 OASIS DTD。我希望读者按顺序读取author 元素,然后是type 的aacute 节点EntityReference,最后是author end 元素,而不会抛出任何错误。我怎样才能实现这个目标?
更新:我还想防止字符实体的扩展,例如á.
.net ×5
c# ×5
iis ×2
algorithm ×1
asp.net ×1
asp.net-mvc ×1
cultureinfo ×1
date ×1
datetime ×1
dtd ×1
http ×1
http-headers ×1
int ×1
open-source ×1
random ×1
signing ×1
strongname ×1
xml ×1
xmlreader ×1