【问题标题】:How to iterate over an Array/List/IEnumerable the full range of UInt32 in Random order?如何以随机顺序遍历 Array/List/IEnumerable 的 UInt32 的全部范围?
【发布时间】:2013-10-10 23:06:25
【问题描述】:

我尝试了几种方法,但没有找到我需要的。

我的目标:使用 UInt32 的每个可能值运行一个函数并记录结果。

uint 的顺序无关紧要,但我更喜欢非顺序

有什么想法吗?

这些是我尝试过的一些:

for ( var u = UInt32.MinValue; u < UInt32.MaxValue; u++ ) { Debug.WriteLine( u ); } //works, but sequential

var list = Enumerable.Range( Int32.MinValue, Int32.MaxValue ).Select( i => ( UInt32 ) i );  //works, but sequential

var list = Enumerable.Range( Int32.MinValue, Int32.MaxValue ).OrderBy( o => rnd.Next() ).Select( i => ( UInt32 ) i );  //OutOfMemoryException because of the OrderBy

我还尝试分配一个数组并交换所有元素,但我手边没有那个代码。但它也抛出了 OutOfMemoryException。

我将研究下一个策略,将 UInt32 范围分成可管理的块。

之后的下一个策略是填充 sql 表并查看随机排序需要多长时间。

我希望有人有一个有用的提示。

编辑:Ilya Bursov 的想法可能会奏效.. 谢谢!

【问题讨论】:

  • 我们需要查看您尝试过的代码。
  • 为什么投反对票?我已经列出了我尝试过的内容。

标签: c# uint32


【解决方案1】:

也许是这样的,不是随机的,但至少是非连续的并且涵盖了整个范围:

UInt32 i = 0;
do
{
    UInt32 newIndex = ((i & 0xffff) << 16) | (i >> 16); // swap 2 high bytes with 2 low bytes
    // do something with element in array at index newIndex
    i++;
} while (i != 0);

【讨论】:

    【解决方案2】:

    这是按顺序执行的,但这会起作用:

            for (uint i = UInt32.MinValue; i < UInt32.MaxValue; ++i)
            {
                ...
            }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      • 1970-01-01
      • 2021-04-09
      • 2023-03-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多