【算法】有序打乱

Kation 2015-11-14 11:55:30
传入:
int seed,种子
int max,最大值
int value,要打乱的值 0 < value <= max

使得传入的value变成另一个数,0 < value <= max
并且传入1至max的value出来的数字不重复

大家有没有研究过这类算法?
...全文
231 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
秋的红果实 2015-11-14
  • 打赏
  • 举报
回复
没有说清楚啊,请详细说来
xuzuning 2015-11-14
  • 打赏
  • 举报
回复
伪随机数发生器 (A * b + c) % m,令周期(m)为 max + 1 则在 0 - max 范围里不会有重复
Poopaye 2015-11-14
  • 打赏
  • 举报
回复
int value = (int)((30637L * i + seed) % max);
xuzuning 2015-11-14
  • 打赏
  • 举报
回复
线性同余的计算量小,但参数不是很好找 利用 RSA 算法要容易些,但计算量大
Poopaye 2015-11-14
  • 打赏
  • 举报
回复
引用 10 楼 ZIP_xG 的回复:
[quote=引用 6 楼 shingoscar 的回复:] b就是value a和c是你自己定的
比如我取A
引用 9 楼 shingoscar 的回复:
[quote=引用 8 楼 ZIP_xG 的回复:] [quote=引用 6 楼 shingoscar 的回复:] b就是value a和c是你自己定的
我不知道a和c有什么条件,我自己试了,有些可以有些不行[/quote] a必须和m互质,就是最大公约数是1 c无所谓,只不过c = 0时value不能为0 比如a = 3, c = 1, m = 4 0->1 1->0 2->3 3->2[/quote]
List<int> result = new List<int>();
int max = 985245;
int seed = Math.Abs(Guid.NewGuid().GetHashCode() % max);
for (int i = 0; i < max; i++)
{
    int value = (30637 * i + seed) % max;
    result.Add(value);
}
var distinct = result.Distinct().ToList();
比如这个,distinct.Count不等于result.Count 30637是质数[/quote] 你都溢出了还谈什么?
Kation 2015-11-14
  • 打赏
  • 举报
回复
引用 6 楼 shingoscar 的回复:
b就是value a和c是你自己定的
比如我取A
引用 9 楼 shingoscar 的回复:
[quote=引用 8 楼 ZIP_xG 的回复:] [quote=引用 6 楼 shingoscar 的回复:] b就是value a和c是你自己定的
我不知道a和c有什么条件,我自己试了,有些可以有些不行[/quote] a必须和m互质,就是最大公约数是1 c无所谓,只不过c = 0时value不能为0 比如a = 3, c = 1, m = 4 0->1 1->0 2->3 3->2[/quote]
List<int> result = new List<int>();
int max = 985245;
int seed = Math.Abs(Guid.NewGuid().GetHashCode() % max);
for (int i = 0; i < max; i++)
{
    int value = (30637 * i + seed) % max;
    result.Add(value);
}
var distinct = result.Distinct().ToList();
比如这个,distinct.Count不等于result.Count 30637是质数
Poopaye 2015-11-14
  • 打赏
  • 举报
回复
引用 8 楼 ZIP_xG 的回复:
[quote=引用 6 楼 shingoscar 的回复:] b就是value a和c是你自己定的
我不知道a和c有什么条件,我自己试了,有些可以有些不行[/quote] a必须和m互质,就是最大公约数是1 c无所谓,只不过c = 0时value不能为0 比如a = 3, c = 1, m = 4 0->1 1->0 2->3 3->2
Kation 2015-11-14
  • 打赏
  • 举报
回复
引用 6 楼 shingoscar 的回复:
b就是value a和c是你自己定的
我不知道a和c有什么条件,我自己试了,有些可以有些不行
Forty2 2015-11-14
  • 打赏
  • 举报
回复
class Tests
{
    static void Main()
    {
        Transformer t = new Transformer(0, 4);
        int i1 = t[1]; // 3
        int i2 = t[2]; // 4
        int i3 = t[3]; // 2
        int i4 = t[4]; // 1
        int i5 = t[2]; // 4
    }
}
class Transformer
{
    readonly int[] array;
    public Transformer(int seed, int max)
    {
        array = Enumerable.Range(1, max).ToArray();
        Random random = new Random(seed);
        for (int i = 0; i < array.Length; i++)
        {
            int j = random.Next(i, array.Length);
            int swap = array[i]; array[i] = array[j]; array[j] = swap;
        }
    }
    public int this[int value]
    {
        get {return array[value - 1];}
    }
}
Poopaye 2015-11-14
  • 打赏
  • 举报
回复
b就是value a和c是你自己定的
Kation 2015-11-14
  • 打赏
  • 举报
回复
引用 4 楼 shingoscar 的回复:
[quote=引用 1 楼 xuzuning 的回复:] 伪随机数发生器 (A * b + c) % m,令周期(m)为 max + 1 则在 0 - max 范围里不会有重复
你漏了个条件,A和m必须互质[/quote] 请问这个方法的参数都是什么?
Poopaye 2015-11-14
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
伪随机数发生器 (A * b + c) % m,令周期(m)为 max + 1 则在 0 - max 范围里不会有重复
你漏了个条件,A和m必须互质
Kation 2015-11-14
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
伪随机数发生器 (A * b + c) % m,令周期(m)为 max + 1 则在 0 - max 范围里不会有重复
A,b,c是什么参数?怎么多了一个?

111,095

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧