当第一个除以第二个整数时,生成两个随机整数,其余为0

时间:2017-11-26 04:26:12

标签: java oop

嗨我需要生成两个随机整数,如果我将第一个整数除以第二个整数,则提醒应为0.我正在寻找方法来做到这一点。两个整数也应大于0

Random rnd=new Random();
int firstNum=rnd.nextInt();
int secondNum=rnd.nextInt();
//Some efficient calculations here to make firstNum % secondNum equals 0.
  

我希望 firstNum%secondNum 等于 0

4 个答案:

答案 0 :(得分:1)

这是一个简单的算法:

  1. 随机选择第一个整数
  2. 将第一个整数计算在内并构建该数字的所有除数列表
  3. 随机选择其中一个除数
  4. 第二个数字的唯一有效选择是第一个数字的除数。如果第一个数字是素数,那么可能的选择集可以小到2,如果是1,那么可以选择零,并且数字本身不是可接受的答案(你没有指定)。

    另一种方法是只生成第二个数字的随机数,并检查它们是否除了第一个数字,但这可能需要 非常 很长时间,特别是如果第一个数字是一个大素数。不推荐。

答案 1 :(得分:0)

CREATE PROCEDURE dbo.CustomTasksHistory
    (
      @Username NVARCHAR(255)
    )
AS
    DECLARE @TempTableStatus TABLE
        (
          ItemID INT ,
          SequenceID INT ,
          TaskStatus NVARCHAR(25) ,
          ListID UNIQUEIDENTIFIER ,
          WebID UNIQUEIDENTIFIER ,
          SiteID UNIQUEIDENTIFIER
        );

    DECLARE @ItemID INT;
    DECLARE @SequenceID INT;
    DECLARE @ListID UNIQUEIDENTIFIER;
    DECLARE @WebID UNIQUEIDENTIFIER;
    DECLARE @SiteID UNIQUEIDENTIFIER;
    DECLARE @AssignTask VARCHAR(25);
    SET @AssignTask = 'Assign task';

    -- Select final TaskStatus of each ItemID with its SequenceID --
    DECLARE cursor_ItemID CURSOR FAST_FORWARD READ_ONLY FOR
        SELECT  DISTINCT
                WI.ItemID ,
                WP.SequenceID ,
                WI.ListID ,
                WI.WebID ,
                WI.SiteID
        FROM    dbo.WInstance WI
                INNER JOIN dbo.WProgress WP ON WI.InstanceID = WP.InstanceID
        WHERE   WP.CurrentActivityTitle = @AssignTask;

    OPEN cursor_ItemID;

    FETCH NEXT FROM cursor_ItemID INTO @ItemID, @SequenceID, @ListID, @WebID, @SiteID;

    WHILE @@FETCH_STATUS = 0
        BEGIN
            INSERT  INTO @TempTableStatus
                    ( ItemID ,
                      SequenceID ,
                      TaskStatus ,
                      ListID ,
                      WebID ,
                      SiteID
                    )
                    SELECT TOP 1
                            WI.ItemID ,
                            WP.SequenceID ,
                            CASE WHEN WP.ActivityComplete = 0
                                 THEN 'Not Started'
                                 ELSE 'Completed'
                            END AS 'TaskStatus' ,
                            WI.ListID ,
                            WI.WebID ,
                            WI.SiteID
                    FROM    dbo.WInstance WI
                            INNER JOIN dbo.WProgress WP ON WI.InstanceID = WP.InstanceID
                    WHERE   WP.CurrentActivityTitle = @AssignTask
                            AND WI.ItemID = @ItemID
                            AND WP.SequenceID = @SequenceID
                            AND WI.ListID = @ListID
                            AND WI.WebID = @WebID
                            AND WI.SiteID = @SiteID
                    ORDER BY TimeStamp DESC;

            FETCH NEXT FROM cursor_ItemID INTO @ItemID, @SequenceID, @ListID, @WebID, @SiteID;
        END;

    CLOSE cursor_ItemID;
    DEALLOCATE cursor_ItemID;

    SELECT  *
    FROM    @TempTableStatus;

这种方法可能比其他方法花费更多时间,但它符合您问题的基本概念,因为它产生两个随机数,而不管其他数字的知识,因此它不关心数字是素数,奇数还是甚至。它会给你两个数字,它们相互分开,给出余数为0。

答案 2 :(得分:0)

如果您可以为firstNumber和secondNumber提供限制,那么您可以尝试以下解决方案。

public static void Main()
    {
        var random = new Random();
        int firstNo = random.Next(800);
        int secondNo = random.Next(400);

        while(firstNo % secondNo != 0)
        {
             secondNo = random.Next(400);
        }

        Console.WriteLine(firstNo);
        Console.WriteLine(secondNo);
    }
}

第二个随机数的种子是400,因为数字的除数总是该数字本身或其值的一半。

也许你可以修改它以适合你的场景。

答案 3 :(得分:0)

我会把算法略微转过头来。

你想要的是两个整数,两者都具有某种随机性(彼此独立),这样firstNumber / secondNumber = K + 0,其中K是某个整数。但是如果你求解firstNumber,那就意味着firstNumber = secondNumber * K.所以不是直接生成secondNumber,而是生成K.

  1. 选择secondNumber作为随机int。执行此操作的好方法是Random#nextInt(int bound) + 1(您需要turl = 'http://portfolios.morningstar.com/fund/summary?t=SPY' test_html = read_html(turl) df<-html_table(test_html, fill = TRUE) ,因为+ 1可能会返回0)。
  2. 选择 K 作为随机int,类似于上一步。
  3. 将firstNumber计算为secondNumber * K.现在丢弃K;你不再需要它了。
  4. 现在你有了两个号码。你知道secondNumber / firstNumber的余数为0,因为secondNumber / firstNumber = K,其中K是你选择的第二个随机整数。